[PL/SQL]一定レコード数単位で更新・コミットする

SQL

一定レコード数単位で更新・コミットする

例)

HOGE_TABLE テーブルの HOGE_CD カラムをすべて 「CD99」に更新する。

1万レコード単位で更新・コミットする。

SET SERVEROUTPUT ON;

DECLARE
 CURSOR c_hoge_table IS SELECT rowid c_rowid FROM HOGE_TABLE;
 v_rowid DBMS_SQL.UROWID_TABLE;
 v_update_count NUMBER(10) := 0;
BEGIN
 DBMS_OUTPUT.PUT_LINE(TO_CHAR(SYSDATE, 'YYYY/MM/DD HH24:MI:SS') || '[START] UPDATE SQL');

OPEN c_hoge_table;
 LOOP
  -- 1万レコード単位で更新・コミットする
  FETCH c_hoge_table BULK COLLECT INTO v_rowid LIMIT 10000;
  EXIT WHEN v_rowid.count = 0;

  FOR ALL i IN 1..v_rowid.cont

   UPDATE HOGE_TABLE
   SET
    HOGE_CD = 'CD99'
   WHERE
    rowid = v_rowid(i);
   v_update_count := v_update_count + SQL%ROWCOUNT;
   COMMIT;

 END LOOP;
CLOSE c_hoge_table;

DBMS_OUTPUT.PUTLINE(TO_CHAR(SYSDATE, 'YYYY/MM/DD HH24:MI:SS') || '[END] TOTAL UPDATE:' || v_update_count || 'record');
DBMS_OUTPUT.PUTLINE(TO_CHAR(SYSDATE, 'YYYY/MM/DD HH24:MI:SS') || '[END] UPDATE SQL');

EXCEPTION
 WHEN OTHERS THEN
  DBMS_OUTPUT.PUTLINE(TO_CHAR(SYSDATE, 'YYYY/MM/DD HH24:MI:SS') || '[ERROR] ERRORCODE:' || SQLCODE);
  DBMS_OUTPUT.PUTLINE(TO_CHAR(SYSDATE, 'YYYY/MM/DD HH24:MI:SS') || '[ERROR] ERRORMSG:' || SQLERRM);
  DBMS_OUTPUT.PUTLINE(TO_CHAR(SYSDATE, 'YYYY/MM/DD HH24:MI:SS') || '[END] TOTAL UPDATE:' || v_update_count || 'record');
  -- カーソルが開いていた場合クローズする
  IF c_hoge_table%ISOPEN THEN
   CLOSE c_hoge_table;
  END IF;
  ROLLBACK;
  -- エラー発生を明示的に返却する
  RAISE;
 END;
/

レコード数が少ない場合

レコード数が少ない場合はバルクフェッチする必要はありません。

参考リンク

バルクフェッチ

コメント

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