从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

希望有所帮助。