Нужно ли делать коммит при выполнении цикла Форалла в PL / SQL? - PullRequest
3 голосов
/ 10 марта 2011

Автоматически ли фиксируется цикл PL / SQL через определенные промежутки времени, или мне нужно фиксировать после цикла?

Oracle 10g и 11g

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

В настоящее время у меня есть сценарий pl / sql, который выполняет массовый сбор, а затем запускает 3 различных цикла выполнения, которые перебирают сбор. В настоящее время я выполняю коммит после каждого цикла forall, с оператором commit в скрипте. Это нужно? Замедляет ли это выполнение, особенно если в коллекции несколько миллионов записей?

Спасибо

Ответы [ 2 ]

4 голосов
/ 10 марта 2011

Вы должны явно фиксировать после FORALL.В конце концов, вы выполняете высокоскоростной DML с использованием FORALL, и, как вы (должны) знать, DML не фиксирует автоматически.

Кроме того, даже несмотря на то, что FORALL перебирает все строки коллекции, это не цикл, это утверждение.У него нет ни оператора LOOP, ни оператора END LOOP.

3 голосов
/ 10 марта 2011

Оператор FORALL является стандартным DML: это просто набор отдельных операторов. Поэтому вы должны следовать стандартным правилам принятия решения о необходимости фиксации: фиксировать только в конце транзакции, когда вы достигли согласованного состояния, никогда прежде.

Нет смысла совершать 3 раза, если у вас есть 3 оператора FORALL, за исключением случаев, когда каждый оператор, взятый отдельно, является отдельной транзакцией.

В любом случае, если ваша работа завершится неудачно после первого оператора FORALL, будет намного легче перезапустить ее, если вы еще не подтвердили.

...