2012-08-28 3 views
0

Oracle RDBMS에서 명령문을 실행하려고하면 상태가 항상 OCI_INVALID_HANDLE이되고 (gdb로 검사 됨) 명령문이 실행되지 않습니다.OCIStmtPrepare가 항상 OCI_INVALID_HANDLE을 반환합니다.

월 누군가가이 작업을 얻을 도움이 될 수 :

OCIEnv* envh; 
OCISvcCtx* svch; 
OCIError* errh; 
sword stat; 
stat = OCIExtProcGetEnv (context, &envh, &svch, &errh); 
OCIStmt* stmthp; 

char errbuf[512]; 
sb4 errcode = 0; 

char * cmd = "alter session set NLS_DATE_FORMAT='dd/mm/yyyy hh24:mi:ss'"; 

sword status = OCIStmtPrepare(stmthp, errh, (const OraText*)cmd, (ub4) strlen(cmd), (ub4) OCI_NTV_SYNTAX, (ub4) OCI_DEFAULT); 

if (status != OCI_SUCCESS) 
{ 
    OCIErrorGet((void*)errh, (ub4) 1, (text *) NULL, &errcode, 
      (text*)errbuf, (ub4) sizeof(errbuf), OCI_HTYPE_ERROR); 
    OCIExtProcRaiseExcpWithMsg((OCIExtProcContext*)context, errcode, (text*)errbuf, sizeof(errbuf));  
} 

context 문제없이이 외부 절차

간단한 OCIExtProcRaiseExcpWithMsg((OCIExtProcContext*)context, 34, (text*)"custom", 6); 작업에 PL/SQL로부터 전달 된 OCIExProcContext*입니다. 게다가 나는 gdb와 다른 모든 포인터를 검사했고 그들은 꽤 좋은 것처럼 보였다. 초기화를 놓칠 수 있습니까?

답변

4

성명서 핸들을 할당하는 것을 잊었습니다. OCIStmtPrepare에 전달되는 stmthp 변수가 초기화되지 않았습니다.

sword status = OCIHandleAlloc((dvoid *)envh, 
       (dvoid **) &stmthp, 
       (ub4) OCI_HTYPE_STMT, 
       (size_t) 0, 
       (dvoid **) 0)); 
관련 문제