OCI 인터페이스를 사용하여 C++에서 Oracle 저장 프로 시저를 호출하고 해당 매개 변수로 out SYS_REF_CURSOR를 사용하여 결과를 반복합니다. 순서. 나는 OCI를 처음 사용하기 때문에 간단한 것을 놓치고있을 수도 있습니다. 이 코드의 대부분은 여기에서 가져온 것입니다 : https://community.oracle.com/thread/507765?start=0&tstart=0OCI를 통해 Oracle 저장 프로 시저를 호출하고 C++의 out 참조 커서로 결과를 반환하십시오.
내 저장 프로 시저는 다음과 같습니다
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 11.2.0.4.0 릴리스 미리 감사드립니다.
OCCI (인스턴트 클라이언트)를 사용하지 않는 이유를 알고 싶습니다. – user2672165
'sqlCharArray' 란 무엇입니까? –
안녕하세요, 위의 코드를 sqlCharArray를 비롯한 자세한 내용으로 업데이트했습니다. 나는 지금까지 OCCI에 대해 들어 보지 못했지만 (매우 흥미로웠다), 그러나 이것이 가능하고 OCI에서 어떻게되는지 여전히 알고 싶다. –