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

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 は整数のホスト変数で、渡される行の数が格納されます。

JDBC での OpenESQL

JDBC で OpenESQL を使用する場合、次のことが該当します。

制約事項: 次のシナリオでは、ストアド プロシージャ呼び出しのカーソルを閉じるときに、COBOL コンパイラが出力ホスト変数の更新に失敗する可能性があります。この問題は、ストアド プロシージャが次の 3 つの条件をすべて満たしている場合に発生します。
  • OPEN 文を使用して呼び出されている
  • 戻り値、出力パラメーター、またはその両方を返す
  • 結果セットを返す

この失敗は、COBOL コンパイラが (可能な場合) 01 レベル フィールドとその下位の 01 レベル "FILLER" フィールドを JVM タイプとしてコンパイルするために起こります。

正常なコンパイルを保証するには、オブジェクト タイプ (string、binary-long、BigDecimal など) ではなく従来の COBOL データ型 (PIC X(n)、COMP-3 など) をホスト変数に使用して、次のいずれかを行います。

  • NOILNATIVE COBOL コンパイラ指令を使用してコンパイルする
  • FILLER 以外のレコード名を使用して、レベル 02 以上で戻り値または出力パラメーターを受信するホスト変数を宣言する

このシナリオは、CALL 文を使用して呼び出されたストアド プロシージャには適用されません。