0

Oracle RDBMS でステートメントを実行しようとすると、常にOCI_INVALID_HANDLEステータス (gdb でチェック) が表示されるため、ステートメントは実行されません。

誰かがこれを機能させるのを手伝ってくれるかもしれません:

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));    
}

contextOCIExProcContext*PL/SQLからこの外部プロシージャに渡されます

問題のない簡単なOCIExtProcRaiseExcpWithMsg((OCIExtProcContext*)context, 34, (text*)"custom", 6);作業。さらに、他のすべてのポインターを gdb でチェックしたところ、非常に良さそうです。初期化を逃した可能性はありますか?

4

1 に答える 1

4

ステートメント ハンドルを割り当てるのを忘れました。stmthp渡す変数は初期化されOCIStmtPrepareていません:

sword status = OCIHandleAlloc((dvoid *)envh, 
                 (dvoid **) &stmthp,
                 (ub4) OCI_HTYPE_STMT,  
                 (size_t) 0, 
                 (dvoid **) 0));
于 2012-08-28T21:25:06.063 に答える