尝试通过OCI执行函数时出现ORA-01008错误

时间:2016-04-22 02:15:36

标签: oracle oci ora-01008

我们正在尝试执行需要参数的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语句:

  2. $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匿名阻止:

    2. $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命令才能成功绑定。

1 个答案:

答案 0 :(得分:0)

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

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

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

案例2中的代码现在出现错误"无效的SQL语句"我们将在单独的帖子中打开一个新的查询。

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