исключение в хранимой процедуре - PullRequest
3 голосов
/ 22 февраля 2012

У меня следующая процедура:

procedure mayFailProc() as
begin
    insert into t1 (id, val) values (1, '123');
    insert into t1 (id, val) values (2, '123');
    insert into t1 (id, val) values (3, '123'); //fails, i.e. due to pk uniqueness error
end;

это исключение, выброшенное в mayFailProc, является обычной вещью, и оно обрабатывается вызывающей стороной. Таким образом, транзакция не откатывается и выполнение продолжается, как если бы не было исключения в mayFailProc. Интересно, что будет с первыми двумя успешно выполненными вставками? Будут ли они сохранены или нет?

Ответы [ 2 ]

3 голосов
/ 22 февраля 2012

См. здесь для объяснения Oracle .Для начала можно перейти к разделу Как Oracle выполняет неявные откаты.

Перед выполнением инструкций INSERT, UPDATE или DELETE Oracle помечает неявную точку сохранения (недоступную для вас).Если инструкция не выполняется, Oracle возвращается к точке сохранения.Обычно выполняется откат только неудачного оператора SQL, а не всей транзакции.Если в операторе возникает необработанное исключение, среда хоста определяет, что нужно откатить.

Подробнее:

Вы должны явно фиксировать или откатывать каждую транзакцию.Выполняете ли вы принятие или откат в вашей PL / SQL-программе или из клиентской программы, зависит от логики приложения.Если вы не фиксируете или не откатываете транзакцию явно, клиентская среда определяет ее конечное состояние.

Например, в среде SQL * Plus, если ваш блок PL / SQL не содержит оператора COMMIT или ROLLBACKокончательное состояние вашей транзакции зависит от того, что вы делаете после запуска блока.Если вы выполняете определение данных, управление данными или оператор COMMIT или если вы выполняете команду EXIT, DISCONNECT или QUIT, Oracle фиксирует транзакцию.Если вы выполняете инструкцию ROLLBACK или прерываете сеанс SQL * Plus, Oracle откатывает транзакцию.

0 голосов
/ 22 февраля 2012

Только что сделал быстрый тест ... строки в моем тесте не были сохранены, когда третья вставка вызвала ошибку "уникальное ограничение ... нарушено"

...