Appeler une procédure stockée Oracle via OCI et renvoyer les résultats avec un curseur de renvoi sortant en C ++

Je voudrais appeler une procédure stockée Oracle à partir de C ++ en utilisant l’interface OCI et parcourir les résultats en utilisant un paramètre SYS_REF_CURSOR en tant que paramètre de la procédure. Je suis nouveau dans OCI, alors il se peut qu’il manque quelque chose de simple. La plupart de ce code provient de cet endroit : https://community.oracle.com/thread/507765?start=0&tstart=0

Ma procédure stockée est:

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; 

Et mon extrait de code c ++ est:

 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++; } 

La procédure stockée sera difficile à changer, alors préférez modifier mon code. La version Oracle est la suivante: Oracle Database 11g Édition Enterprise Edition 11.2.0.4.0 Merci d’avance.

Vous avez défini:

 sqlCharArray = "BEGIN FXT_TEST_CALL; END;" 

Qui n’a pas de parameters de liaison; vous essayez d’en définir un, d’où l’erreur et la définition de procédure en requirejs un. Vous devez l’appeler comme:

 sqlCharArray = "BEGIN FXT_TEST_CALL(:1); END;"