一定レコード数単位で更新・コミットする
例)
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;
/
レコード数が少ない場合
レコード数が少ない場合はバルクフェッチする必要はありません。
コメント