从Oracle存储过程返回OCI8表
问题描述:
我通过OCI8连接到Oracle。从Oracle存储过程返回OCI8表
我有一个存储过程:
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号线,共lumn 7:PLS-00306:错号码或类型的呼叫参数“OCIGETACCOUNTS”
我怎样才能获得$结果到容器上的表资源
答
据我所知,$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.
}
这是我们如何处理游标从数据库返回。 希望这可以解决问题
答
有PHP和REFCURSORS问题。看到一个完整的解释这个优秀的博客文章和解决方法:
http://blogs.oracle.com/opal/entry/converting_ref_cursor_to_pipe
希望有所帮助。