2012-02-27 18 views
0

CからOCIを介してOracleデータベースにコールを行います。OCI_INVALID_HANDLE - 無効なサービス・コンテキスト、接続または文ハンドル

initOracle(..) { .. //return successful or 0 } 

int executeGetQuery(char * query, char * queryResultData) { 
    char stmt[255]; 

    OCIError *errhp; 
    OCIDefine *defnp = (OCIDefine *) 0; 
    OCIStmt *stmthp; 
    OCISvcCtx *svchp; //server context handle (almost like DBPROCESS) 
    sb2 is_null; 

    memset((char *)stmt, 0, 255); 
    //TODO replace with query 
    sprintf((char *)stmt, "SELECT min(ID) as MINID FROM BNS_SAA_CONFIRMATIONS where SentToWssStatus<>'T'"); 

    /* prepare statement */ 
    if(checkerr(errhp, OCIStmtPrepare(stmthp, errhp, (text *) stmt, 
      (ub4) strlen((char *) stmt), 
      (ub4) OCI_NTV_SYNTAX, (ub4) OCI_DEFAULT)) == OCI_ERROR) 
     return -1; 

    /* define output params */ 
    if(checkerr(errhp, OCIDefineByPos(stmthp, &defnp, errhp, 1, (dvoid *) queryResultData, 
      (sword) strlen(queryResultData), SQLT_STR, (dvoid *) &is_null, (ub2 *)0, 
      (ub2 *)0, OCI_DEFAULT)) == OCI_ERROR)//maybe replace SQLT_STR w SQLT_CHR OMFWTD 
     return -1; 

    /* execute the statement */ 
    status = OCIStmtExecute(svchp, stmthp, errhp, (ub4) 1, (ub4) 0, (CONST OCISnapshot *) NULL, (OCISnapshot *) NULL, OCI_DEFAULT); 
    .... 
} 

が、私はこれらの機能にエラー面を考える:私はこのコードを継承し

OCI_INVALID_HANDLE - Invalid service context, connection or statement handle

は、私はこのエラーを取得するOCIStmtExecute(..)またはOCIDefineByPos(..)またはOCIStmtPrepare(..)

質問: このエラーを解決する方法クエリの実行を開始しますか?

エラードキュメント:http://docs.oracle.com/cd/B28359_01/appdev.111/b28395/oci02bas.htm

+1

あなたは長い道のりを歩んできました...あなたは関数のローカルな束を持っているようですが、どこにも配置されていないようです。まずは、ここでサーバーに接続するコードはありません。それは意味のある「OCISvcCtx」を得るために必要な作業です。OCIプログラミング・ドキュメンテーションのイントロを読んで、すべてのデモを利用することをお勧めしますオラクル社が提供するコードは、リンク先の付録Bにあります。 – Hoons

+0

答えとしてあなたのコメントを受け入れる:)私には無意味な名前を持つローカル変数でした。回答として投稿してください。ありがとう! – Adrian

答えて

1

うーん...私はローカルに定義されているOCIハンドルが割り当てられ、および/または正しく初期化されていないのいずれかがわかります。これらのステップが継承した他のコードで実行されている場合は、そのハンドルへのポインタを取得する方法があることを確認する必要があります。そうでない場合、エラー処理セクションにリンクしているOracleドキュメントには、OCIプログラミングの素晴らしいイントロと深いデモ・プログラムが用意されています(Oracle開発者アカウントを作成し、OCIクライアントをダウンロードしてあなたのどこかにアクセスできない)。幸いなことに、OCIは巨大なAPIですが、オントロジー以外でナビゲートする方法を学べば、オラクル独自のドキュメントは素晴らしいです。OCI Relational functions section(少なくとも10gに相当)が非常に価値があるとわかりました。

+0

私はそれらを他のどこかでインスタンス化していますが、これらの変数がどのように使われているのか分かりませんでした。私はインスタンス化されたものを使うことができるように、解決策はvarsをexternすることでした。ありがとう! – Adrian

関連する問題