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

Верно ли следующее утверждение из 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

person sql_dummy    schedule 04.01.2018    source источник


Ответы (1)


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

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

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

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

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

person Littlefoot    schedule 04.01.2018
comment
нет, я имею в виду, что мой вопрос в другом. В соответствии с документом не выполняется откат в случае сохранения подпрограммы с необработанным исключением. Но в действительности выполняется откат. - person sql_dummy; 04.01.2018
comment
Не явно, но - не будет никакого вреда, если вы действительно прочитаете то, что видите. Oracle выполнил неявный откат, так как блок PL/SQL вышел из строя. - person Littlefoot; 04.01.2018
comment
Вся обработка, выполняемая Oracle, будет называться неявной, верно? Если нет, то как Oracle явно обрабатывает что-то другое? - person sql_dummy; 04.01.2018
comment
Это вы (разработчик) явно что-то делаете. Например, когда вы выполняете оператор ALTER TABLE, Oracle неявно фиксирует все предыдущие изменения. Когда вы INSERT INTO, UPDATE и DELETE и COMMIT в конце, вы явно приказали Oracle сохранить изменения, т.е. зафиксировать. - person Littlefoot; 04.01.2018
comment
хорошо, но оракул не делает никакого отката в этом случае, и я тоже. Тогда почему они откатываются; - person sql_dummy; 04.01.2018
comment
Как вы понимаете, Oracle не откатывается? Это происходит, как только вы нажмете оператор TESTY INSERT INTO, который попытается вставить еще одну 1 в столбец, ограниченный ограничением первичного ключа. - person Littlefoot; 04.01.2018
comment
Я получил соль здесь - person sql_dummy; 04.01.2018
comment
Что он говорит, если вы вызываете процедуру (возбуждение исключения (необработанное)) в анонимном блоке и ловите исключение (без применения отката). Остальные вставки не откатываются. Таким образом, если исключение осталось необработанным, откат не происходит в процедуре, но откат происходит в анонимном блоке. - person sql_dummy; 04.01.2018