4

PL/SQLのforallループは特定の間隔で自動的にコミットされますか?またはループ後にコミットする必要がありますか?

オラクル 10g および 11g

FORALL i IN x.FIRST .. x.LAST
    delete from table where 1=1;

現在、一括収集を行う pl/sql スクリプトを取得し、コレクションを反復処理する 3 つの異なる forall ループを実行しています。私は現在、各 forall ループが完了した後に、スクリプトに commit ステートメントを使用してコミットしています。これは必要ですか?特にコレクションに数百万のエントリがある場合、実行が遅くなりますか?

ありがとう

4

2 に答える 2

4

FORALL ステートメントは標準の DML であり、個々のステートメントの単なるバッチです。したがって、コミットする必要があるかどうかを判断するための標準的なルールに従う必要があります。トランザクションの最後でコミットするのは、一貫した状態を達成したときだけです。

3 つの FORALL ステートメントがある場合、3 回コミットする理由はありません。ただし、個々のステートメントが 1 つのトランザクションである場合を除きます。

いずれにせよ、最初の FORALL ステートメントの後でジョブが失敗した場合、まだコミットしていなければ、再開するのはずっと簡単です。

于 2011-03-10T12:24:01.950 に答える
4

FORALL の後に明示的にコミットする必要があります。結局のところ、FORALL を使用して高速な DML を実行しているため、ご存じのとおり、DML は自動的にコミットされません。

また、FORALL はコレクションのすべての行を繰り返しますが、それはループではなく、ステートメントです。LOOP ステートメントも END LOOP ステートメントもありません。

于 2011-03-09T22:44:07.217 に答える