2023年3月30日木曜日

oracle sqlで1000件のupdateを100件ごとにcommitしたい

select * from a_table where com = 'test' は1000件ヒットするとします


これを update a_table set upd=sysdate where com = 'test' とすると1000件アップデートされるが

100件ごとにコミットしたい


DECLARE

  CNT NUMBER := 0;

BEGIN

  FOR rec IN (SELECT * FROM a_table WHERE com = 'test') LOOP

    CNT := CNT + 1;

    UPDATE a_table SET upd = SYSDATE WHERE id = rec.id;

    IF MOD(CNT, 100) = 0 THEN

      COMMIT;

    END IF;

  END LOOP;

  COMMIT;

END;

/


まずカウンター変数CNTを初期化

その後、a_tableテーブルからcom列がtestのレコードを1件ずつ取得して、取得したレコードのid列に該当する行を更新

その際、カウンター変数CNTをインクリメント

そして、カウンター変数CNTを100で割った余りが0であれば、コミット

最後に再度コミットを行ってトランザクションを確定