#oracle #oracle-call-interface
Вопрос:
Я пытаюсь выполнить простую хранимую процедуру с помощью Oracle OCI. Хранимая процедура принимает строку в качестве входных данных и копирует ее в выходной параметр. Ниже приведен оператор oracle, который я выполняю:
DECLARE OutParam VARCHAR2(50);
BEGIN
my_stored_procedure('Test String', OutParam);
END;
И я написал код OCI следующим образом:
/* Bind a placeholder for the output parameter */
if (status = OCIBindByPos(stmthp, amp;bnd6p, errhp, 1,
(dvoid *)result, 1024, SQLT_STR,
(dvoid *)0, (ub2 *)0, (ub2 *)0, (ub4)0, (ub4 *)0, OCI_DEFAULT))
{
checkerr(errhp, status);
cleanup();
return OCI_ERROR;
}
/* execute and fetch */
if (status = OCIStmtExecute(svchp, stmthp, errhp, (ub4)1, (ub4)0,
(CONST OCISnapshot *) NULL, (OCISnapshot *)NULL, OCI_DEFAULT))
{
if (status != OCI_NO_DATA)
{
checkerr(errhp, status);
cleanup();
return OCI_ERROR;
}
}
С Oracle 11g и более старыми версиями это работало нормально, и я смог получить выходной параметр, сохраненный в переменной «результат», которую я использовал в вызове OCIBindByPos.
Однако с Oracle 12 и выше это не работает для меня, я получаю следующую ошибку:
OCI_ERROR — ORA-03137: неправильно сформированный пакет TTC от клиента отклонен: [kpoal8Check-5] [32768]
Кто-нибудь знает, почему это не работает с Oracle версий 12 и выше? Я проверил это с помощью Oracle 12 и Oracle 19 и получил ту же ошибку.
Комментарии:
1. Взгляните на community.oracle.com/tech/developers/discussion/4337508/… и support.oracle.com/knowledge/Oracle Database Products/…