Php 使用oci_new_集合访问包中定义的varray类型

Php 使用oci_new_集合访问包中定义的varray类型,php,oracle,packages,oracle-call-interface,varray,Php,Oracle,Packages,Oracle Call Interface,Varray,您好,我正在尝试将varray从PHP传递到Oracle。我使用的是OCI8,之前曾将varray用作存储过程中的参数,并在编译时创建了这些varray的类型。因此,在PHP端创建集合实例时,我们可以直接提到集合名称 例: 其中,我的_数组将是我在Oracle实例中声明的varray类型 create or replace type MY_ARRAY as varray(100) of varchar2(20); 因此,当我在包外部创建它们时,类型将被编译并在执行期间准备就绪 如果我从软件包中

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

例:

其中,我的_数组将是我在Oracle实例中声明的varray类型

create or replace type MY_ARRAY as varray(100) of varchar2(20);
因此,当我在包外部创建它们时,类型将被编译并在执行期间准备就绪

如果我从软件包中执行此操作,我将返回错误

PHP警告:未找到oci\u新集合()[函数.oci新集合]:oci-22303:type.“我的包.我的数组类型”

我的包头应该是这样的

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\u name的形式执行此操作,但收到的警告是type not found。

尝试以大写形式传递schema和typename

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

我发现OCI引用没有任何限制,但PL\SQL引用的信息量更大:

在中定义的PL/SQL复合类型 软件包规格不兼容 具有相同定义的局部或局部 独立存储类型

同样从PL\SQL参考(表5-1)来看,所有类型的集合都有限制。例如,在包级别声明的VARRAY:

仅在以下情况下才能为ADT属性数据类型 在模式级别定义

这对我很有用:

$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

这样做后,尝试以大写形式传递模式,以小写形式传递typename,但仍然会出现相同的错误。只有在该模式中不存在包和类型时,才会提到该模式。在这种情况下,他们会:(因此,如果没有架构级定义,似乎无法做到这一点。是的,似乎是这样,您知道如何将日期从php传递到oracle中预期日期的包吗?乍一看有些变体:使用CLOB解析db大小,SYS_REFCURSOR作为包函数中的输入参数,数组到REFCURSOR PL/SQL实现,以及最后,使用ANYDATA
$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