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 回答