ここでは、バルク SQL を使用して複数レコードを変数に格納してからループ処理を行うサンプルを掲載しています。詳細はサンプル内のコメントを参照ください。
スポンサーリンク
バルク SQL のサンプル
CREATE OR REPLACE PROCEDURE TEST
IS
-- 設備マスタ行タイプを定義
TYPE machine_tbl_type IS TABLE OF M_MACHINE%ROWTYPE INDEX BY BINARY_INTEGER;
machine_tbl machine_tbl_type; -- 行変数
BEGIN
-- 設備マスタから技術部門のレコードをすべて取得
SELECT * BULK COLLECT INTO machine_tbl FROM M_MACHINE WHERE BUMON = '技術';
-- 1件以上レコードが取得できた場合
IF machine_tbl.COUNT > 0 THEN
-- 行の最初から最後までループ
FOR i IN machine_tbl.FIRST..machine_tbl.LAST LOOP
-- 対象のレコードにメモを追加
UPDATE M_MACHINE SET MEMO = '技術部門の設備を全部廃棄' WHERE MACHINE_NO = machine_tbl( i ).MACHINE_NO;
END LOOP;
/*
* FOR LOOP の変わりに FORALL を使用しても同様の結果となる。
* パフォーマンスは FORRALL を使用したほうが良いだろう。
* ただし、通常の FOR LOOP よりも制約があるので代替できない場合も多い。
*/
/*
-- machine_tbl.FIRST..machine_tbl.LAST の代わりに 1..machine_tbl.COUNT を使用している
FORALL i in 1..machine_tbl.COUNT
UPDATE M_MACHINE SET MEMO = '技術部門の設備を全部廃棄' WHERE MACHINE_NO = machine_tbl( i ).MACHINE_NO;
*/
END IF;
END;
/
本サンプルは、本来 UPDATE 文を一度実行するれば足りることを、わざわざループ処理しているので無意味ですが、理解の一助とはなると思います。
参考