2

パラメータを必要とするオラクル関数を実行しようとしていますが、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

この問題は部分的に解決されました。

PL/SQL ではなく、SQL ステートメントに対してのみ機能するようになりました。しかし、ORA-01008 エラーは解消されました。

上記のケース 1 のコードはそのまま機能します。デバッグ用に追加されたコメントと行のクリーンアップを行いましたが、何らかの形で sqlstmt が変更され、バインドに影響を与えた可能性があります。

ケース 2 のコードは、「無効な SQL ステートメント」というエラーを返します。これについては、別のスレッドで新しい問い合わせを開きます。

最初の問い合わせを解決するのに役立つことがわかった非常に有用な情報は、 https ://docs.oracle.com/database/121/LNOCI/oci05bnd.htm#LNOCI16368 にあります。

于 2016-04-29T14:36:01.733 に答える