Вызовите хранимую процедуру Oracle через OCI и верните результаты с указателем out ref в C ++.

0

Я хотел бы вызвать хранимую процедуру Oracle из C++ с использованием интерфейса OCI и выполнить итерацию результатов с использованием SYS_REF_CURSOR в качестве параметра процедуры. Я новичок в OCI, поэтому может быть пропущено что-то простое. Большая часть этого кода взята здесь: https://community.oracle.com/thread/507765?start=0&tstart=0

Моя хранимая процедура:

CREATE OR REPLACE PROCEDURE FXT_TEST_CALL(CRESULTS OUT SYS_REFCURSOR) IS
sTESTQUERY VARCHAR2(4000);

BEGIN
sTESTQUERY := ' SELECT set_nam, cc_type from  fxt_con_rules';

OPEN CRESULTS FOR sTESTQUERY;
END 
FXT_TEST_CALL;

И мой фрагмент кода C++:

OCIError* pOciError;
int answer;
OCIStmt* pOciStatement;
char* sqlCharArray = "BEGIN FXT_TEST_CALL; END;";
char set_nam[40];
char cc_type[40];
OCIEnv* g_pOciEnvironment = NULL;
OCIServer* g_pOciServer = NULL;
OCISession* g_pOciSession = NULL;
OCISvcCtx* g_pOciServiceContext = NULL;
sb2* pIndicator=0;
sb2* pIndicator2=0;
sb2* pIndicator3=0;
OCIDefine* pOciDefine;
OCIDefine* pOciDefine2;
OCIBind* pBind;
OCIStmt* cursor;
answer = OCIHandleAlloc(g_pOciEnvironment, (void **)(&pOciStatement), OCI_HTYPE_STMT, 0, NULL);
answer = OCIStmtPrepare(pOciStatement, pOciError, (unsigned char *)sqlCharArray, strlen(sqlCharArray),OCI_NTV_SYNTAX, OCI_DEFAULT);
answer = OCIHandleAlloc(g_pOciEnvironment, (void **)(&cursor), OCI_HTYPE_STMT, 0, NULL);

// I get an error "ORA-01036: illegal variable name/number" after this line
answer = OCIBindByPos(pOciStatement,&pBind, pOciError, 1, &cursor, 0,SQLT_RSET, pIndicator2, 0,NULL, 0,0,OCI_DEFAULT);
answer = OCIStmtExecute(g_pOciServiceContext, pOciStatement, pOciError, 1, 0, NULL, NULL, OCI_COMMIT_ON_SUCCESS);
answer = OCIDefineByPos(cursor,&pOciDefine, pOciError,1,set_nam,40, SQLT_STR,pIndicator, 0, 0,OCI_DEFAULT);
answer = OCIDefineByPos(cursor,&pOciDefine2, pOciError,2,cc_type,40, SQLT_STR,pIndicator3, 0, 0,OCI_DEFAULT);

// loop for debug to see if set_nam and cc_type are being populated
int blah = 0;
while ((answer = OCIStmtFetch(cursor,pOciError, 1,OCI_FETCH_NEXT,OCI_DEFAULT)) == 0)
{
    blah++;
}

Сохраненная процедура будет трудно изменить, поэтому предпочтитете изменить мой код. Версия Oracle: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 Спасибо заранее.

  • 0
    Я хотел бы знать, почему вы не используете OCCI (мгновенный клиент)?
  • 0
    Что находится в sqlCharArray ?
Показать ещё 1 комментарий
Теги:
stored-procedures
oci

1 ответ

0
Лучший ответ

Вы установили:

sqlCharArray = "BEGIN FXT_TEST_CALL; END;"

У которого нет параметров привязки; вы пытаетесь установить его, следовательно, ошибка, и для определения процедуры требуется одно. Вы должны назвать это как:

sqlCharArray = "BEGIN FXT_TEST_CALL(:1); END;"
  • 0
    Спасибо Алекс, теперь это работает в этой тестовой программе! Я пробовал этот подход в своей основной программе и раньше, и он не работал, но теперь я знаю, что это произошло из-за передачи указателей и ссылок везде, а не самих вызовов OCI.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню