2014-09-10 4 views
0

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 릴리스 미리 감사드립니다.

+0

OCCI (인스턴트 클라이언트)를 사용하지 않는 이유를 알고 싶습니다. – user2672165

+0

'sqlCharArray' 란 무엇입니까? –

+0

안녕하세요, 위의 코드를 sqlCharArray를 비롯한 자세한 내용으로 업데이트했습니다. 나는 지금까지 OCCI에 대해 들어 보지 못했지만 (매우 흥미로웠다), 그러나 이것이 가능하고 OCI에서 어떻게되는지 여전히 알고 싶다. –

답변

0

은 당신이 설정 한 :

에는 바인드 매개 변수가 없습니다
sqlCharArray = "BEGIN FXT_TEST_CALL; END;" 

; 당신은 하나를 설정하려하고있다. 따라서 에러와 프로 시저 정의는 하나를 요구한다.

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

감사합니다. Alex,이 테스트 프로그램에서 작동합니다! 이전에 주 프로그램에서이 접근법을 시도했지만 작동하지 않았지만 이제는 포인터와 참조가 어디서나 전달되고 OCI가 호출하지 않기 때문에 발생합니다. –