我通过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到容器表资源
答案 0 :(得分: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.
}
这是我们处理从数据库返回的游标的方法。 希望这能解决问题
答案 1 :(得分:0)
PHP和REFCURSORS存在问题。有关完整说明和解决方法,请参阅此博客文章:
http://blogs.oracle.com/opal/entry/converting_ref_cursor_to_pipe
希望有所帮助。