フェッチ・アクロス・コミット (fetch across commit) 処理
フェッチ・アクロス・コミットとは SELECT カーソルのループ内において、トランザクションを発生させて COMMIT 処理 しているもの。
ロールバックセグメントの設計(個数・サイズ)によっては
ORA-01555: スナップショットが古すぎます: ロールバック・セグメント番号string、名前"string"が小さすぎます。
のエラーが発生する。このエラーは、色々な現場でよく話題になる。(自動UNDO管理
に移行が望ましい)
注意
フェッチ・アクロス・コミットでは、(COMMIT で ロックは解放されるため) SELECT 〜 FOR UPDATE を カーソル にしたフェッチ・アクロス・コミットは使用できない。そのため WHERE CURRENT OF による更新もできない。SELECT 〜 FOR UPDATE を使用しても ORA-01002: フェッチ順序が無効です。エラーになる。
フェッチ・アクロス・コミット 使用例
FOR vRec IN ( SELECT id, name FROM sample_table WHERE gender = 'MALE')
LOOP
DBMS_TRANSACTION.USE_ROLLBACK_SEGMENT('専用ロールバックセグメント');
-- 手動管理
UPDATE sample_table SET name = 'Mr.' || name WHERE id = vRec.id;
COMMIT ;
END LOOP;
関連事項