2014-09-10 76 views
0

我想使用OCI接口从C++调用Oracle存储过程,并使用out SYS_REF_CURSOR作为参数来遍历结果程序。我是OCI新手,所以可能会错过简单的东西。大部分代码是从这里取:https://community.oracle.com/thread/507765?start=0&tstart=0通过OCI调用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企业版版本11.2.0.4.0 在此先感谢。

+0

我想知道您为什么不使用OCCI(即时客户端)? – user2672165 2014-09-10 18:00:34

+0

sqlCharArray中有什么? – 2014-09-10 18:02:45

+0

嗨,我已更新上面的代码与更多的细节,包括sqlCharArray。我到目前为止还没有听说过OCCI(看起来很有趣),但是我仍然想知道这是否可行,以及OCI如何。 – 2014-09-11 07:35:42

回答

0

您已经设置:

sqlCharArray = "BEGIN FXT_TEST_CALL; END;" 

它没有绑定参数;你试图设置一个,因此错误,程序定义需要一个。您需要将其称为:

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

谢谢亚历克斯,它现在可以在这个测试程序中运行!我曾在我的主程序中尝试过这种方法,但它不起作用,但现在我知道这是由于各处传递了指针和引用,而不是OCI自己调用它们。 – 2014-09-11 08:44:50

相关问题