簡體   English   中英

Oracle OCI OCIStmtFetch2掛起光標C ++

[英]Oracle OCI OCIStmtFetch2 hangs cursor C++

當我嘗試遍歷游標時,我的代碼掛起。 execute語句返回大約800k的結果(當我在sqlplus中運行時)。 當我做類似的事情調用具有20個結果的簡單存儲過程時,它會立即返回。 我已將該程序掛起超過12個小時,但仍未返回。 我正在使用Oracle11g oci.lib,但是當我使用9i版本的lib進行測試時,它在5秒鍾內返回。 我無法使用9i Oci(出於無法控制的原因)。 我懷疑OCIStmtFetch2()調用是先預緩存所有結果。 是否可以停止此操作並使光標可用?

存儲過程聲明:

CREATE OR REPLACE PROCEDURE FXT_TEST_CALL(CRESULTS OUT SYS_REFCURSOR) IS

這是代碼:(我已經刪除了一些樣板)

OCIStmt* pOciStatement;
OCIStmt* cursor;
OCIEnv* g_pOciEnvironment = NULL;
OCIServer* g_pOciServer = NULL;
OCISession* g_pOciSession = NULL;
OCISvcCtx* g_pOciServiceContext = NULL;
char* sqlCharArray = "BEGIN fxt.fxt_test_call(:refCursor ); END;";

answer = OCIInitialize(OCI_THREADED, NULL, NULL, NULL, NULL);
answer = OCIEnvInit(&g_pOciEnvironment, OCI_DEFAULT, 0, NULL);
answer = OCIHandleAlloc(g_pOciEnvironment, (void **)&pOciError, OCI_HTYPE_ERROR, 0, NULL);
answer = OCIHandleAlloc(g_pOciEnvironment, (void **)&g_pOciSession, OCI_HTYPE_SESSION, 0, NULL);
answer = OCIHandleAlloc(g_pOciEnvironment, (void **)&g_pOciServer, OCI_HTYPE_SERVER, 0, NULL);
answer = OCIHandleAlloc(g_pOciEnvironment, (void **)&g_pOciServiceContext, OCI_HTYPE_SVCCTX, 0, NULL);
answer = OCIServerAttach(g_pOciServer, pOciError, (unsigned char *)pConnectChar, strlen(pConnectChar),OCI_DEFAULT);
answer = OCIAttrSet(g_pOciSession, OCI_HTYPE_SESSION, (unsigned char *)pUsernameChar, strlen(pUsernameChar),OCI_ATTR_USERNAME, pOciError);
answer = OCIAttrSet(g_pOciSession, OCI_HTYPE_SESSION, (unsigned char *)pPasswordChar, strlen(pPasswordChar),OCI_ATTR_PASSWORD, pOciError);
answer = OCIAttrSet(g_pOciServiceContext, OCI_HTYPE_SVCCTX, g_pOciServer, 0, OCI_ATTR_SERVER, pOciError);
answer = OCIAttrSet(g_pOciServiceContext, OCI_HTYPE_SVCCTX, g_pOciSession, 0, OCI_ATTR_SESSION, pOciError);
answer = OCISessionBegin(g_pOciServiceContext, pOciError, g_pOciSession, OCI_CRED_RDBMS, OCI_DEFAULT);
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);

answer = OCIBindByPos(pOciStatement,&pBind, pOciError, 1, &cursor, 0,SQLT_RSET, pIndicator2, 0,NULL, 0,0,OCI_DEFAULT);

OCINumber numTest;

answer = OCIStmtExecute(g_pOciServiceContext, pOciStatement, pOciError, 1, 0, NULL, NULL, OCI_COMMIT_ON_SUCCESS);
answer = OCIDefineByPos(cursor,&pOciDefine2, pOciError,1,&numTest,sizeof(OCINumber), SQLT_VNU, 0, 0, 0,OCI_DEFAULT);

// Program hangs here
while ((answer = OCIStmtFetch2(cursor,pOciError, 1,OCI_FETCH_NEXT,0,OCI_DEFAULT)) == 0)
{
    OCIAttrGet(cursor, OCI_HTYPE_STMT, (void*)&fetched, NULL, OCI_ATTR_ROWS_FETCHED, pOciError);
    long long newNum =  0;
    OCINumberToInt(pOciError, &numTest, sizeof(long long), OCI_NUMBER_SIGNED , &newNum);
}

由於問題已經徘徊了一段時間,所以我會回答任何好奇的人,我是如何解決這種情況的。 在MFC調試版本中,它的執行速度很慢,所以我在發布模式下運行,並且正常工作(暫停2分鍾)。

我仍然看不到會有什么不同,也許庫在調試/發布版本中的工作方式有所不同。

無論如何,至少現在暫時不再是問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM