0

PHP変数をpl/sql配列にバインドしようとしています。手動で実行してバインドを設定すると、pl/sql プロシージャは正常に動作するので、それが問題ではないことはわかっています。oci_bind_array_by_name問題を起こしているのはこいつです。

oci_bind_array_by_name関数を呼び出す以下の PHP コードの行で、次のエラー メッセージが表示されます。

Warning: oci_bind_array_by_name() [function.oci-bind-array-by-name]: You must provide max length value for empty arrays

ドキュメントごとに関数呼び出しで実際に最大長(250)を提供しているため、混乱しています。

http://php.net/manual/en/function.oci-bind-array-by-name.php PHP 5.1.6 を使用しています

関連する PHP コードは次のとおりです。

$SQL = "BEGIN MYPKG.PROCESS_USERS(:USER_ID_ARRAY); END;";

$conn = self::getConnection();
$stmt = OCIParse($conn, $SQL);
$userIdArray= array(); /*I've also tried not initializing the OUT array (same error)
If I put some dummy value into the $userIdArray the procedure will run fine, but the results afterward will contain only that dummy value and not the output of the procedure*/
oci_bind_array_by_name($stmt,'USER_ID_ARRAY', $userIdArray, 250, -1, SQLT_VCS);

パッケージで配列型が定義されています。

TYPE USER_ID_ARRAY IS TABLE OF VARCHAR2(250) INDEX BY BINARY_INTEGER;

The PROCESS_USERS function in an abbreviated form:
PROCEDURE PROCESS_USERS(p_userIdArray out USER_ID_ARRAY) AS
  --Code here which processes all waiting users and returns their IDs in p_userIdArray
END PROCESS USERS;
4

1 に答える 1

0

そして、API を十分に読んでいなかったので、私は愚か者のように感じます。どうやら max_table_length を指定していたようですが、エラー メッセージは -1 として残した max_item_length を参照していました。

バインドを次のように変更したところ、動作するようになりました:

oci_bind_array_by_name($stmt,'USER_ID_ARRAY', $userIdArray, 250, 250, SQLT_VCS);
于 2010-06-02T18:47:53.253 に答える