Ref Cursor Support

AdvancedServerOpenClientLibraryは、オラクルと互換性のあるPL/SQLプロシージャで REF CURSOROUT パラメータとして使用することをサポートしています。サポートは、次のAPIを通じて提供されます。

  • OCIBindByName

  • OCIBindByPos

  • OCIBindDynamic

  • OCIStmtPrepare

  • OCIStmtExecute

  • OCIStmtFetch

  • OCIAttrGet

EDBOCLコネクターは、 SQLT_RSET データタイプもサポートしています。

次の例は、カーソルを開き、出力パラメータとして REF CURSOR を返すストアドプロシージャを呼び出す方法を示しています。コードサンプルでは、 openCursor 名前付けのPL/SQLプロシージャ( REF CURSOR 型の OUT パラメータを使用)がデータベースサーバに作成され、必要なハンドルが割り当てられていることを前提としています。

char * openCursor =
  "begin \
     openCursor(:cmdRefCursor); \
   end;";
OCIStmt *stmtOpenRefCursor;
OCIStmt *stmtUseRefCursor;

REF CURSOR を開いて使用するストアドプロシージャを実行するためのハンドルを割り当てます。

/* Handle for the stored procedure to open the ref cursor */
OCIHandleAlloc((dvoid *) envhp,
               (dvoid **) &stmtOpenRefCursor,
               OCI_HTYPE_STMT,
               0,
               (dvoid **) NULL));
/* Handle for using the Ref Cursor */
OCIHandleAlloc((dvoid *) envhp,
               (dvoid **) &stmtUseRefCursor,
               OCI_HTYPE_STMT,
               0,
               (dvoid **) NULL));

次に、 REF CURSOR を開くために使用されるPL/SQLブロックを準備します。

OCIStmtPrepare(stmtOpenRefCursor,
                 errhp,
                 (text *) openCursor,
                 (ub4) strlen(openCursor),
                 OCI_NTV_SYNTAX,
                 OCI_DEFAULT));

PL/SQL openCursor OUT パラメータをバインドします。

OCIBindByPos(stmtOpenRefCursor,
                 &bndplrc1,
                 errhp,
                 1,
                 (dvoid*) &stmtUseRefCursor,
                         /* the returned ref cursor */
                 0,
                 SQLT_RSET,
                      /* SQLT_RSET type representing cursor */
                 (dvoid *) 0,
                 (ub2 *) 0,
                 (ub2) 0,
                 (ub4) 0,
                 (ub4 *) 0,
                 OCI_DEFAULT));

stmtOpenRefCursor ステートメントハンドルを使用して、 openCursor プロシージャを呼び出します。

OCIStmtExecute(svchp,
                 stmtOpenRefCursor,
                 errhp,
                 1,
                 0,
                 0,
                 0,
                 OCI_DEFAULT);

この時点で、 stmtUseRefCursor ステートメントハンドルには、カーソルへのリファレンスが含まれています。情報を取得するには、refカーソルの出力変数を定義します。

/* Define the output variables for the ref cursor */
  OCIDefineByPos(stmtUseRefCursor,
                   &defnEmpNo,
                   errhp,
                  (ub4) 1,
                  (dvoid *) &empNo,
                  (sb4) sizeof(empNo),
                  SQLT_INT,
                  (dvoid *) 0,
                  (ub2 *)0,
                  (ub2 *)0,
                  (ub4) OCI_DEFAULT));

次に、結果セットの最初の行をターゲット変数にフェッチします。

/* Fetch the cursor data */
  OCIStmtFetch(stmtUseRefCursor,
                  errhp,
                  (ub4) 1,
                  (ub4) OCI_FETCH_NEXT,
                  (ub4) OCI_DEFAULT))