[ Oracle PL/SQL ] バルクSQLで複数レコードを取得する ( BULK COLLECT INTO )

Pocket

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

参考

 

スポンサーリンク

Pocket

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>