访问使用包oci_new_collection内部限定一个VARRAY类型(Access a var

2019-10-30 11:53发布

你好我想在可变数组传递从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新收集]:OCI-22303: “”类型“my_pack.my_array_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_name,但我正在逐渐写着键入找不到警告。

Answer 1:

试图通过架构和大写TYPENAME

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

UPD。

我发现在OCI参考没有限制,但是PL \ SQL参考了更多的信息:

在封装规范中定义的PL / SQL复合类型是不相容具有相同定义的本地或存储独立型

此外,从PL \ SQL参考(表5-1)收藏的各种有限制。 例如VARRAY宣布在封装级:

只能如果在架构级定义的ADT属性数据类型



Answer 2:

这对我的作品:

$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


文章来源: Access a varray type defined inside a package using oci_new_collection