ストアド プロシージャおよび結果セットの操作

OpenESQL SQL CLR または DBMS ベンダー固有のストアド プロシージャでは、次の操作を実行できます。

注: ストアド プロシージャの機能はデータベース製品ごとに大きく異なり、各製品は上記の機能を部分的に実装しているに過ぎません。このため、データベース間でのストアド プロシージャの呼び出しの移植性は、OpenESQL 文に比べると大幅に限定されます。

結果セットを返さないストアド プロシージャの呼び出し

結果セットを返さないストアド プロシージャを呼び出すには、CALL 埋め込み SQL 文を使用します。この文の使用に関する詳細は、CALL のトピックを参照してください。

1 つ以上の結果セットを返すストアド プロシージャの呼び出し

1 つ以上の結果セットを返すストアド プロシージャは、DECLARE CURSOR 文を使用して宣言する必要があります。次に例を示します。

         EXEC SQL 
                DECLARE cursorName CURSOR FOR storedProcedureCallStatement
         END-EXEC

次に、OPEN 文を使用してカーソルを開くその他のタイプのカーソルと同じように、ストアド プロシージャを呼び出し、その後に FETCH 文を続けて結果セットの行をフェッチします。

複数の結果セットを返すようにストアド プロシージャがコーディングされている場合で、FETCH 文から 100 の SQLCODE (現在の結果セットの終わりを示す) が返された場合、GET NEXT RESULT SET 文を使用して後続の結果セットを次のようにフェッチできます。
          EXEC SQL
                 GET NEXT RESULT SET FOR cursorName
          END-EXEC

GET NEXT RESULT SET 文から 0 の SQLCODE が返された場合、使用可能な他の結果セットがあるため、GET NEXT RESULT SET をさらに発行してそれらを取得できます。ただし、GET NEXT RESULT SET で 100 の SQLCODE が返された場合、使用可能な結果セットはもうありません。

配列パラメーターの使用

ODBC パラメーターは Oracle の配列引数とは異なります。パラメーター配列を使用する場合は、配列の各要素に同じ文を繰り返し実行した場合と同じ結果を得られます。ストアド プロシージャ呼び出しで 1 つのパラメーターを配列として渡すと、他のすべての引数も同じ数の要素を含む配列として渡されます。ストアド プロシージャでは、これらのパラメーターの各「行」で呼び出された場合と同様の処理が実行されます。呼び出しの前に次の指定を置くことで、渡す行数を配列全体のサイズ未満に制限できます。
FOR :hvar
				

ここで、:hvar は整数のホスト変数で、渡される行の数が格納されます。

結果セットを返す OpenESQL SQL CLR ストアド プロシージャのコーディング

ストアド プロシージャで 1 つ以上のカーソルを宣言し、宣言した各カーソルから複数の結果セットが返されるよう複数の SELECT 文を定義内に含めることで、呼び出し側のプログラムに複数の結果セットを返します。

特定のカーソルで複数の結果セットを返すには、ストアド プロシージャ内の DECLARE CURSOR 文でカーソルを開き、さらに取得する各結果セットの SELECT 文を含める必要があります。次に例を示します。
      EXEC SQL 
          DECLARE C1 CURSOR
          FOR
              SELECT CUSTID FROM COMPANY;
              SELECT CUSTNAME FROM COMPANY;
      END-EXEC
      EXEC SQL OPEN C1 END-EXEC

      EXEC SQL 
      DECLARE C2 CURSOR
      FOR
          SELECT COMPNAME FROM COMPANY;
      END-EXEC
      EXEC SQL OPEN C2 END-EXEC

この例には C1 と C2 という 2 つのカーソルがあり、C1 が 2 つの結果セットを、C2 が 1 つの結果セットを返します。そのため、これらのカーソルによって合計 3 つの結果セットが呼び出し側アプリケーションに返されます。

ストアド プロシージャ内でカーソル処理が済んだら、WITH RETURN 句を含む CLOSE 文を使用して各カーソルを閉じます。次に例を示します。
EXEC SQL CLOSE C1 WITH RETURN TO CALLER END-EXEC
EXEC SQL CLOSE C2 WITH RETURN TO CALLER END-EXEC

カーソルが閉じられると、関連付けられていた結果セットが呼び出し側アプリケーションで使用可能になります。

注: ストアド プロシージャが返ったときに開いていた、順方向で読み取り専用カーソルも呼び出し側アプリケーションに返されます。

OpenESQL SQL CLR ストアド プロシージャおよび結果セットと OpenESQL の呼び出し元との対話方法

結果セットを返す SQL CLR ストアド プロシージャは、他のタイプのストアド プロシージャとは異なる方法で呼び出し元と対話します。例えば、z/OS DB2 の場合、呼び出された COBOL ストアド プロシージャはそのすべてのコードを実行し、制御を呼び出し元に完全に戻します。これは、SQL CLR COBOL ストアド プロシージャの場合には当てはまりません。制御が呼び出し元に戻されるのは、RETURN TO CALLER を指定した EXEC SQL CLOSE カーソルが実行された後です。呼び出し元が対応する結果セットを使用すると (つまり、SQLCODE=100 になるまで FETCH すると)、制御が SQL CLR ストアド プロシージャに戻され、追加のコードを実行できるようになります。したがって、SQL CLR ストアド プロシージャの場合、CLOSE カーソル文の実行後にストアド プロシージャ コード自体が基本的に待機状態になります。

これを回避するには、可能であれば、すべての CLOSE with RETURN 文をストアド プロシージャ全体に分散するのではなく、ストアド プロシージャ コードの末尾に置くことをお奨めします。これにより、SQL CLR ストアド プロシージャの呼び出しによって実行される対話の回数が最小限に抑えられ、基本的に、対話の量が多いために生じる可能性がある副作用が排除されます。

SQL CLR ストアド プロシージャでは、出力パラメーター値を使用可能にするには、呼び出し元が最初にすべての結果セットを使用する必要があります。