PLSQLでFETCH INTOとFORALL文を使って複数行を1回で処理する

PLSQLでFETCH INTOとFORALL文を使って複数行を1回で処理する

FETCH INTOを使うと結果セットのレコード数を変数に一括で代入することができます。

FETCH カーソル名 BULK COLLECT INTO 変数名 (LIMIT 1000);

「LIMIT レコード数」と指定することができます。これはセレクト結果が10000件だった場合、1000件ずつフェッチするという意味です。省略することも可能です。

LIMIT句を指定する場合はFOR文でループする必要があります。

OPEN カーソル名;
LOOP
  FETCH カーソル名 BULK COLLECT INTO 変数名 LIMIT 1000;
  ~
  EXIT WHEN カーソル名%NOTFOUND;
END LOOP;

このようにFETCH INTOを使うと10000件あるデータを1000件ずつ処理したりすることができ、非常に便利です。

このFOR文の中でFORALLすることにより、1000件ずつ処理することができます。

OPEN カーソル名;
LOOP
  FETCH カーソル名 BULK COLLECT INTO 変数名 LIMIT 1000;
  FORALL i IN 1..変数名.COUNT
  UPDATE テーブル名
  SET   カラム名1 = 変数名(i).フィールド名1
  WHERE カラム名2 = 変数名(i).フィールド名2;

  COMMIT;
  EXIT WHEN カーソル名%NOTFOUND;
END LOOP;

コメント

タイトルとURLをコピーしました