ここでは、バルク 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 文を一度実行するれば足りることを、わざわざループ処理しているので無意味ですが、理解の一助とはなると思います。
参考