0

OCI8経由でOracleに接続しています。

私はストアドプロシージャを持っています:

  PROCEDURE ocigetaccounts(accounts OUT SYS_REFCURSOR)
  IS BEGIN
  OPEN accounts FOR
        SELECT * FROM tbaccounts;
  END ocigetaccounts;

そして、OCIを使用してPHPに戻そうとしています:

$sqlString = 'BEGIN accounts.ocigetaccounts(:accounts); END;';
oci_bind_by_name($statement, ':accounts', $result, -1);
    echo $result;

(必要な php 側の OCI の残りの部分は用意されています。)

私が得ているエラーは次のとおりです。

警告: oci_execute(): ORA-06550: 行 1、列 7: PLS-00306: 'OCIGETACCOUNTS' の呼び出しで引数の数または型が間違っています

テーブルリソースをコンテナ化するために $result を取得するにはどうすればよいですか

4

2 に答える 2

2

私が知る限り、$resultあなたが求めているリソースが含まれます。取得しているエラーは、カーソルがタイプ カーソルとして定義されていないためです。$resultカーソルとして明示的に定義する必要があります

$result = oci_new_cursor( $dbci );

が返された場合$result、それはリソースとして返されるため、他の返されたリソースを処理するのと同じように処理する必要があります。

あなたの例($dbci接続リソースである場合):

$sqlString = 'BEGIN accounts.ocigetaccounts(:accounts); END;';

$stmt = oci_parse ( $dbci, $sqlString );
//Declare cursor
$result = oci_new_cursor( $dbci );

//Bind cursor
oci_bind_by_name ( $stmt, ':accounts', $result, -1, OCI_B_CURSOR);

//Execute query
if (oci_execute ( $stmt )) {
    //Execute cursor
    oci_execute($result);  //Or you can return the cursor.
}

これは、データベースから返されたカーソルを処理する方法です。これで問題が解決することを願っています

于 2011-11-27T18:10:17.710 に答える
0

PHP と REFCURSORS に問題があります。完全な説明と回避策については、この優れたブログ記事を参照してください。

http://blogs.oracle.com/opal/entry/converting_ref_cursor_to_pipe

それが役立つことを願っています。

于 2011-11-22T23:55:07.687 に答える