Php 使用oci_new_集合访问包中定义的varray类型
您好,我正在尝试将varray从PHP传递到Oracle。我使用的是OCI8,之前曾将varray用作存储过程中的参数,并在编译时创建了这些varray的类型。因此,在PHP端创建集合实例时,我们可以直接提到集合名称 例: 其中,我的_数组将是我在Oracle实例中声明的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); 因此,当我在包外部创建它们时,类型将被编译并在执行期间准备就绪 如果我从软件包中
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