OpenESQL SQL CLR または DBMS ベンダー固有のストアド プロシージャでは、次の操作を実行できます。
結果セットを返さないストアド プロシージャを呼び出すには、CALL 埋め込み SQL 文を使用します。この文の使用に関する詳細は、CALL のトピックを参照してください。
1 つ以上の結果セットを返すストアド プロシージャは、DECLARE CURSOR 文を使用して宣言する必要があります。次に例を示します。
EXEC SQL DECLARE cursorName CURSOR FOR storedProcedureCallStatement END-EXEC
次に、OPEN 文を使用してカーソルを開くその他のタイプのカーソルと同じように、ストアド プロシージャを呼び出し、その後に FETCH 文を続けて結果セットの行をフェッチします。
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 が返された場合、使用可能な結果セットはもうありません。
ストアド プロシージャで 1 つ以上のカーソルを宣言し、宣言した各カーソルから複数の結果セットが返されるよう複数の 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 つの結果セットが呼び出し側アプリケーションに返されます。
結果セットを返す 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 ストアド プロシージャでは、出力パラメーター値を使用可能にするには、呼び出し元が最初にすべての結果セットを使用する必要があります。