Вызов процедуры Oracle с выходными переменными с использованием OCILIB - PullRequest
0 голосов
/ 04 октября 2011

У меня есть процедура со следующей подписью:

procedure countryExists(iCountryName in varchar2, oCount out integer)

Когда я запускаю ее с помощью OCILIB, я не могу получить правильное значение для oCount.Если я регистрирую его как целое число (используя OCI_RegisterInt), я получаю ошибку:

ORA-03116: неверная длина буфера передана в процедуру преобразования

Если я зарегистрирую еев виде строки он запускается, но OCI_GetString возвращает нулевой указатель, а OCI_GetInt возвращает 0 (вместо ожидаемого результата 1).

Код теста:

int init = OCI_Initialize(NULL, NULL, OCI_ENV_DEFAULT|OCI_ENV_CONTEXT);
OCI_Connection *cn = OCI_ConnectionCreate("mydb", "myuser", "mypass", OCI_SESSION_DEFAULT);
OCI_Statement *st = OCI_StatementCreate(cn);

int resultprepare = OCI_Prepare(st, "call mypackage.countryExists('BRAZIL', :oCount)");
//int registercount = OCI_RegisterString(st, ":oCount", 100);
int registercount= OCI_RegisterInt(st, ":oCount");
int executeresult = OCI_Execute(st);
OCI_Error *err1 = OCI_GetLastError();
const char *error1 = OCI_ErrorGetString(err1);
OCI_Resultset *resultset = OCI_GetResultset(st);
const wchar_t *valstr = OCI_GetString(resultset, 1);
int valint = OCI_GetInt(resultset, 1);
OCI_Error *err2 = OCI_GetLastError();
const char *error2 = OCI_ErrorGetString(err2);

Запуск процедуры с использованиемНапример, PL / SQL Developer работает нормально.

Это правильный способ вызова процедур с использованием OCILIB?

Также обратите внимание, что я использую смешанную версию библиотеки.

1 Ответ

1 голос
/ 05 октября 2011

Вы не пишете код на Java ....

Вот правильный способ сделать это:

OCI_Connection *cn;
OCI_Statement  *st;
int count;

OCI_Initialize(NULL, NULL, OCI_ENV_DEFAULT|OCI_ENV_CONTEXT);

cn = OCI_ConnectionCreate("mydb", "myuser", "mypass", OCI_SESSION_DEFAULT);
st = OCI_StatementCreate(cn);

OCI_Prepare(st, "begin mypackage.countryExists('BRAZIL', :oCount); end;");
OCI_BindInt(st, ":oCount", &count);
OCI_Execute(st);

Проверьте документацию и / или руководство OCILIB

Винсент

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...