Ошибка ORA-01008 при попытке выполнить функцию через OCI

Мы пытаемся выполнить функцию оракула, которая требует параметров, и мы получаем ошибку 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 для достижения успешного связывания.

1 ответ

Мы частично решили эту проблему.

Он работает только для операторов SQL, а не для PL/SQL. Но мы избавились от ошибки ORA-01008.

Код в приведенном выше случае 1 работает как есть. Мы провели некоторую очистку комментариев и строк, которые были добавлены для отладки, но они могли как-то изменить sqlstmt, таким образом повлияв на привязки.

Код в случае 2 теперь выдает ошибку "Неверный оператор SQL", для которой мы откроем новый запрос в отдельном потоке.

Одна очень полезная информация, которую мы нашли, чтобы помочь нам решить первоначальный запрос, может быть найдена здесь: https://docs.oracle.com/database/121/LNOCI/oci05bnd.htm

Другие вопросы по тегам