適材適所

WindowsやPowerShellやネットワーク、IBMなどのシステム系の話など気になったことも載せているブログです。

【DB2 for i】SQLプロシージャでOPENされた1つのカーソルを呼び出し元で使うサンプル

探しても見つからなかったので備忘録も兼ねてサンプルを書き残しておきます。

検証した環境

  • IBM i 7.3

SQLプロシージャでカーソルをOPENする

呼び出し元に1つのカーソルを戻すSQLプロシージャ、CALLEDPRCを定義します。

このプロシージャではCOLUMN1,COLUMN2という二つのカラムを持ったEXPAPLET テーブルをSELECTした結果をカーソルとしてOPENするとします。

 
CREATE OR REPLACE PROCEDURE CALLEDPRC
LANGUAGE SQL
RESULT SETS 1
BEGIN
    DECLARE C1 CURSOR FOR
        SELECT COLUMN1,COLUMN2 FROM EXPAPLET;
    OPEN C1;
    SET RESULT SETS WITH RETURN TO CALLER CURSOR C1;
END

OPENされたカーソルを呼び出し元で使用する

呼び出し側ではRESULT_SET_LOCATORを定義します。

また、FETCHの結果を確認するために使うSQLSTATE変数は事前に宣言しておく必要があります。

FETCHの結果を格納する変数も用意します。

 
DECLARE SQLSTATE CHAR(5);
DECLARE MYVAR1 VARCHAR(10);--カーソルの中身を受け取るための変数      
DECLARE MYVAR2 VARCHAR(10);
DECLARE RESULT1 RESULT_SET_LOCATOR VARYING;

--カーソルを返すSQLプロシージャの呼び出し
CALL CALLEDPRC;
--SQLロケーターをRESULT1に割当てる
ASSOCIATE RESULT SET LOCATORS(RESULT1) WITH PROCEDURE CALLEDPRC;

--RESULT1からカーソルを取り出す
ALLOCATE C1 CURSOR FOR RESULT SET RESULT1;    

--カーソルから値を取り出す。ここでは2つの値が入っているとする
FETCH C1 INTO MYVAR1,MYVAR2; 
--全てのデータを取り終えるまで続ける。FETCHが最終行じゃなけれな0000が格納される
WHILE SQLSTATE = '00000' DO 
    --FETCHした変数を使って何かをする
    FETCH C1 INTO MYVAR1,MYVAR2;       
END WHILE;
--カーソルを閉じる
CLOSE C1;

参考

ストアード・プロシージャーから結果セットを受け取るプログラムまたは SQL プロシージャーの作成

※ちなみに↑の例は数少ないサンプルですが、「SQL プロシージャーを使用して結果セットを受け取る方法を示します。 」のところにあるコード例は微妙に間違っており、エラーになるのでご注意を。

超絶簡単ですが、以上になります。