0

您好我正在尝试将可变数组从 PHP 传递到 Oracle。我正在使用 OCI8,并且之前曾将可变数组用作存储过程中的参数,并且在编译时创建了这些可变数组的类型。所以在PHP端制作集合实例时,我们可以直接提及集合名称。

前任:

$my_coll = oci_new_collection($c, 'MY_ARRAY');

其中 MY_ARRAY 将是我在 Oracle 实例中声明的可变数组类型。

create or replace type MY_ARRAY as varray(100) of varchar2(20);

因此,当我在包之外创建它们时,类型会被编译并在执行期间准备就绪。

如果我从包中这样做,我会得到错误

PHP 警告:oci_new_collection() [function.oci-new-collection]: OCI-22303: type ""."my_pack.my_array_type" not found

我的包头看起来像这样

create or replace
PACKAGE my_pack
AS
   TYPE my_array_type is VARRAY(200) of varchar2(20);
    my_arr my_array_type;

    function my_func(
    in_id number,
    in_arr my_array_type    
    )
    return number;

end my_pack;

现在,当我从 PHP 调用创建集合实例时,我就是这样做的

$my_collection = oci_new_collection($connect,'my_pack.my_array_type');

现在我得到了未找到的警告类型。

我的问题是,我将如何调用包中的 varray 类型???我正在以 package.type_name 的形式执行此操作,但我收到了提示未找到类型的警告。

4

2 回答 2

0

尝试以大写形式传递架构和类型名

oci_new_collection($connect,'MY_PACK.MY_ARRAY_TYPE', 'MY_SCHEMA')

更新。

我在 OCI 参考中没有发现任何限制,但 PL\SQL 参考提供了更多信息:

包规范中定义的 PL/SQL 复合类型与相同定义的本地或独立存储类型不兼容

同样来自 PL\SQL Reference(表 5-1)的各种集合都有限制。例如在包级别声明的 VARRAY:

仅当在架构级别定义时才可以是 ADT 属性数据类型

于 2011-02-04T17:48:41.323 回答
0

这对我有用:

$in_arr = array('1','2','3');    
$s = ociparse($database, "BEGIN my_pack.my_func(:in_id, :in_arr); END;");
oci_bind_by_name($s, ':in_id', $in_id, 32 );
oci_bind_array_by_name($s, ':in_arr', $in_arr, 250, -1, SQLT_VCS);

如果您需要:

$out_arr = array(); //OUT   
$s = ociparse($database, "BEGIN my_pack.my_func(:in_id, :out_arr); END;") ;
oci_bind_by_name($s, ':in_id', $in_id, 32);
oci_bind_array_by_name($s,':out_arr', $out_arr, 250, 250, SQLT_VCS);
                                                     // change -1 for 250
于 2012-08-01T17:03:30.493 回答