探しても見つからなかったので備忘録も兼ねてサンプルを書き残しておきます。
検証した環境
- 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 プロシージャーを使用して結果セットを受け取る方法を示します。 」のところにあるコード例は微妙に間違っており、エラーになるのでご注意を。
超絶簡単ですが、以上になります。