概要
この記事は、SQLスクリプトの戻り値として、複数の行を返す方法についてまとめています。
検証環境
製品 | バージョン | 実行環境 |
---|---|---|
TDV | 8.8.0 | Windows 10 |
SQLスクリプト例①
SQLスクリプトから複数行を返すには、プロシージャヘッダーのOUTパラメータに、PIPE修飾子を使用します。
PROCEDURE sample_script_1(OUT result PIPE(productid INT, productname VARCHAR, productdescription VARCHAR, categoryid INT))
そして、PIPE変数(上記例ではresult)に対し、INSERT文で値を挿入します。
INSERT INTO result(productid, productname, productdescription, categoryid) VALUES(productid, productname, productdescription, categoryid);
PIPE修飾子については、以下のドキュメントを参照してください。
スクリプト例
以下のスクリプトは、サンプルテーブル products から4フィールドについて、全レコードを返すものです。
PROCEDURE sample_script_1(OUT result PIPE(productid INT, productname VARCHAR, productdescription VARCHAR, categoryid INT))
BEGIN
-- カーソル
DECLARE c CURSOR FOR SELECT productid, productname, productdescription, categoryid
FROM /shared/examples/ds_inventory/tutorial/products;
-- フィールド
DECLARE productid INT;
DECLARE productname VARCHAR;
DECLARE productdescription VARCHAR;
DECLARE categoryid INT;
OPEN c;
REPEAT
-- productsテーブルから1件ずつ取得し、
FETCH c INTO productid, productname, productdescription, categoryid;
-- result に INSERT する
INSERT INTO result(productid, productname, productdescription, categoryid)
VALUES(productid, productname, productdescription, categoryid);
UNTIL NOT c.FOUND
END REPEAT;
CLOSE c;
END
SQLスクリプト例②
上記のサンプルのように、使用する項目数が多くなるとスクリプトが煩雑になります。
カスタムデータタイプとしてROWを宣言し、よりシンプルにすることもできます。
スクリプト例
PROCEDURE sample_script_2(OUT result PIPE(productid INT, productname VARCHAR, productdescription VARCHAR, categoryid INT))
BEGIN
-- カーソル
DECLARE c CURSOR FOR SELECT productid, productname, productdescription, categoryid
FROM /shared/examples/ds_inventory/tutorial/products;
-- カスタムデータタイプ
DECLARE TYPE product_type ROW (productid INT, productname VARCHAR, productdescription VARCHAR, categoryid INT);
DECLARE product_row product_type;
OPEN c;
REPEAT
-- FETCH, INSERT では、カスタムデータタイプの prodcut_row を使用する
FETCH c INTO product_row;
INSERT INTO result(productid, productname, productdescription, categoryid) VALUES(product_row);
UNTIL NOT c.FOUND
END REPEAT;
CLOSE c;
END
ROWについては、以下の製品ガイドページなどを参照してください。
- TDV リファレンス ガイド > TDV SQL スクリプト > SQL 言語の概念 > データ タイプ
- TDV リファレンス ガイド > TDV SQL スクリプト > SQL スクリプトの例 > 例 10 (Row 宣言)
SQLスクリプト例③
また、FOR文を使用すると、更にシンプルに記述することもできます。
ループ変数 x は、SELECT文に合わせて適切に宣言されます。
スクリプト例
PROCEDURE sample_script_3(OUT result PIPE(productid INT, productname VARCHAR, productdescription VARCHAR, categoryid INT))
BEGIN
FOR x AS SELECT productid, productname, productdescription, categoryid
FROM /shared/examples/ds_inventory/tutorial/products
DO
INSERT INTO result(productid, productname, productdescription, categoryid) VALUES(x);
END FOR;
END
FOR文については、以下の製品ガイドを参照してください。
- TDV リファレンス ガイド > TDV SQL スクリプト > SQL スクリプト ステートメント リファレンス > FOR
- TDV リファレンス ガイド > TDV SQL スクリプト > SQL スクリプトの例 > 例 5 (パイプ変数)