2

我们正在尝试执行一个需要参数的 oracle 函数,但我们收到错误 ORA-01008-并非所有变量都已绑定。我们很确定问题在于我们如何绑定应该接收函数结果的变量。首先我们尝试了以下方法(没有参数的方法):

$tSql:="select staging.FUNC_ORAOCI_TEST() from dual"
$iStatus:=OCIHandleAlloc (envhp;$stmthp;OCI_HTYPE_STMT)
$iStatus:=OCIHandleAlloc (envhp;$errhp;OCI_HTYPE_ERROR)
$iStatus:=OCIStmtPrepare ($stmthp;$errhp;$tSql;OCI_DEFAULT)
$iStatus:=OCIDefineByPos ($stmthp;$bindpp;$errhp;1;->atResults;SQLT_STR;$ORANullIndicator;$ORANullLenArray;$ORANullReturnCodeArray;OCI_DEFAULT)
$iStatus:=OCIStmtExecute (svchp;$stmthp;$errhp;1;0;0;0;OCI_DEFAULT)

它工作得很好......

我们被卡住的地方是尝试将参数传递给函数时(我们故意修改它现在接受参数)

我们认为这是因为我们现在必须按名称进行绑定,但它不起作用。我们已尝试运行 PL/SQL 块,但仍然出现错误。以下是我们失败的尝试:

  1. 使用 SQL 语句:


$tSql:="select staging.FUNC_ORAOCI_TEST(:tParamText,:iParamNum) from dual"
$iStatus:=OCIBindByName ($stmthp;$bindpp;$errhp;":tParamText";-   >tParamText;SQLT_STR;$ORANullIndicator;$ORANullLenArray;$ORANullReturnCodeArray;1;OCI_DEFAULT;BIND_IN)
$iStatus:=OCIBindByName ($stmthp;$bindpp;$errhp;":iParamNum";->iParamNum;SQLT_INT;$ORANullIndicator;$ORANullLenArray;$ORANullReturnCodeArray;1;OCI_DEFAULT;BIND_IN)
$iStatus:=OCIDefineByPos ($stmthp;$bindpp;$errhp;1;->atResults;SQLT_STR;$ORANullIndicator;$ORANullLenArray;$ORANullReturnCodeArray;OCI_DEFAULT)
$iStatus:=OCIStmtExecute (svchp;$stmthp;$errhp;1;0;0;0;OCI_DEFAULT)
  1. 使用 PL/SQL 匿名块:


$tSql:="DECLARE vResult VARCHAR2:=''; BEGIN vResult := FUNC_ORAOCI_TEST(:tParamText,:iParamNum); End;"
$iStatus:=OCIBindByName ($stmthp;$bindpp;$errhp;":tParamText";->tParamText;SQLT_STR;$ORANullIndicator;$ORANullLenArray;$ORANullReturnCodeArray;1;OCI_DEFAULT;BIND_IN)
$iStatus:=OCIBindByName ($stmthp;$bindpp;$errhp;":iParamNum";->iParamNum;SQLT_INT;$ORANullIndicator;$ORANullLenArray;$ORANullReturnCodeArray;1;OCI_DEFAULT;BIND_IN)
$iStatus:=OCIBindByName ($stmthp;$bindpp;$errhp;":vResult";->tResult;SQLT_STR;$ORANullIndicator;$ORANullLenArray;$ORANullReturnCodeArray;1;OCI_DEFAULT;BIND_OUT)
$iStatus:=OCIStmtExecute (svchp;$stmthp;$errhp;1;0;0;0;OCI_DEFAULT)

我们已经研究过类似的问题,但没有人尝试使用 OCI 接口以我们正在执行的方式执行该功能。

我们使用 4D 编码,所以请忽略奇怪的语法。我们只需要关于如何构建语句以及实现成功绑定的正确 OCI 命令的指导。

4

1 回答 1

0

我们部分解决了这个问题。

我们让它只适用于 SQL 语句而不适用于 PL/SQL。但是我们摆脱了 ORA-01008 错误。

上面引用的案例 1 中的代码按原样工作。我们对为调试添加的注释和行做了一些清理,但它们可能以某种方式改变了 sqlstmt,从而影响了绑定。

案例 2 中的代码现在给出了一个错误“无效的 SQL 语句”,我们将在单独的线程中打开一个新的查询。

我们发现可以帮助我们解决初始查询的一个非常有用的信息可以在这里找到: https ://docs.oracle.com/database/121/LNOCI/oci05bnd.htm#LNOCI16368

于 2016-04-29T14:36:01.733 回答