4

У меня есть несколько команд EXECUTE IMMEDIATE в одной процедуре оракула.Обязательно ли COMMIT после каждого ИСПОЛНИТЕЛЬНОГО НЕМЕДЛЕННОГО?

EXECUTE IMMEDIATE 'DELETE FROM tbl1'; 
EXECUTE IMMEDIATE 'INSERT INTO tbl1...'; 
COMMIT; 
EXECUTE IMMEDIATE 'DELETE FROM tbl3'; 
EXECUTE IMMEDIATE 'INSERT INTO tbl3 ...'; 
COMMIT; 
EXECUTE IMMEDIATE 'DELETE FROM tbl4'; 
EXECUTE IMMEDIATE 'INSERT INTO tbl4 ...'; 
COMMIT; 

Нужен ли мне все эти COMMIT или только в конце процедуры?

+1

Вы должны делать только один раз, когда ваша транзакция закончена, поэтому я предполагаю, что это будет в конце. –

ответ

7

Единственный раз, что вы действительно вынуждены совершить, другие thasn в конце бизнес-сделки, являются:

  1. При выполнении DDL: выполнение DDL заворачивают в паре неявных фиксаций.
  2. После прямой вставки пути: таблица не может быть прочитана до тех пор, пока вставка не будет зафиксирована.

Как конные комментарии, правильная точка фиксации в момент завершения бизнес-транзакции. В противном случае вам нужно написать код для обнаружения и исправления частично завершенных транзакций, которые оставили базу данных, это логически несогласованное состояние (например, запись INVOICE существует без записей INVOICE_DETAIL).

4

Commit не требуется после каждого EXECUTE IMMEDIATE. Некоторые утверждения НЕ требуют фиксации; например, если вы усекаете таблицу с помощью TRUNCATE. Усечение выполняется, и нет необходимости в фиксации. нет ROLLBACK. Вы должны знать, что COMMIT и ROLLBACK являются атрибутами сеанса. Вся незафиксированная работа в текущей транзакции фиксируется или откатывается - а не только оператор, выполняемый EXECUTE IMMEDIATE.