【问题标题】:Getting ORA-01008 error when trying to execute a function via OCI尝试通过 OCI 执行函数时出现 ORA-01008 错误
【发布时间】:2016-08-15 11:34:15
【问题描述】:

我们正在尝试执行一个需要参数的 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 命令的指导。

【问题讨论】:

    标签: oracle oracle-call-interface ora-01008


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2020-06-08
      • 1970-01-01
      • 2018-10-25
      • 2012-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-08
      相关资源
      最近更新 更多