Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Ошибка документа? Подпрограмма с необработанным исключением не делает никакого отката?

Автор вопроса: sql_dummyОтветов: 1

Верно ли следующее утверждение из doc:?

Если вы выходите из сохраненной подпрограммы с необработанным исключением, PL/SQL не присваивает значения параметрам OUT и не выполняет никакого отката.

В соответствии с утверждением ROLLBACK не должно происходить, когда моя хранимая процедура testy вызывает необработанное исключение. И согласно вставке документа 3, вставка 2 должна быть успешной, но ни одна вставка не удалась.

create table mytable (num int not null primary key);

insert into mytable values(1);

create or replace procedure testy is
begin
insert into mytable values(2);
insert into mytable values(1); //throws error: ORA-00001: unique constraint (SRISRI1.SYS_C0011447) violated
end;

create or replace procedure testp is
begin
insert into mytable values(3);
testy;
insert into mytable values(4);
end;

exec testp;

select * from mytable;

mytable
_______
1

unhandled-exceptionstored-proceduresrollbackoracle11g

Ответы

Ответ 1 · Littlefoot

Мы обсуждали это в вашем предыдущая тема, не так ли?

Уильям Робертсон сказал:

Вы можете думать, что весь анонимный блок ведет себя как один оператор DML. Если он терпит неудачу, он откатывается к своему собственному началу, как обновление и т. Д.

  • вы вставили значение "1" с помощью инструкции INSERT INTO
  • then you called TESTP which
    • inserted "3"
    • под названием TESTY, который
    • вставил "2"
    • пытался вставить "1", но не удалось

Oracle выполнил неявный откат и отменил INSERT 2 и INSERT 3, что возвращает вас к исходной точке, т. е. к ситуации, которая у вас была до выполнения процедуры TESTP, и это значение 1 в таблице.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы