0

こんにちは私はPHPからOracleにVARRAYを渡そうとしています。私はOCI8を使用しており、以前はストアドプロシージャの引数としてVARRAYを使用しており、コンパイル時にそれらのVARRAYのタイプが作成されます。したがって、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:タイプ""。"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として実行していますが、タイプが見つからないという警告が表示されます。

4

2 に答える 2

0

スキーマとタイプ名を大文字で渡してみてください

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

更新

OCIリファレンスに制限はありませんが、PL\SQLリファレンスの方が有益でした。

パッケージ仕様で定義されたPL/SQL複合型は、同じように定義されたローカルまたはスタンドアロンのストアド型と互換性がありません

また、PL \ SQLリファレンス(表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 に答える