Przegapiłeś kilka innych części książki. Tak, Steven jest prawdą – jeśli w bloku wystąpi wyjątek, wszystkie poprzednie efekty DML pozostaną na swoim miejscu. Jednak w książce powinna być inna wzmianka, że każde wykonanie instrukcji SQL lub PL/SQL najwyższego poziomu (tj. również anonimowy blok) otwiera kursor dla tej instrukcji i jeśli wystąpi wyjątek podczas wykonywania kursora, wszystkie efekty DML zostaną wykonane. podczas wykonywania kursora są cofane. Być może prosty przykład da ci wskazówkę...
W oryginalnym przykładzie wykonałeś ...
BEGIN
DELETE FROM dml_exception;
raise value_error;
END;
... jako oświadczenie najwyższego poziomu. Tak, na końcu bloku, choć nadal w jego obrębie, Twoje delete
efekty pozostały na swoim miejscu. Jednak twój blok zgłosił wyjątek, który został rozpropagowany aż do kursora najwyższego poziomu. Tak więc, aby przestrzegać zasad atomowości
, Oracle wycofało wszystkie oczekujące efekty otwartego kursora.
Jeśli wywołasz swój blok PL/SQL z poziomu innego bloku PL/SQL najwyższego poziomu, który obsługuje i nie zgłasza ponownie wyjątku zgłoszonego w bloku PL/SQL niższego poziomu, ...
BEGIN
BEGIN
DELETE FROM dml_exception;
raise value_error;
END;
EXCEPTION
WHEN others THEN NULL;
END;
..., a następnie delete
skutki pozostają na miejscu. (A ponieważ w tym bloku nie ma zatwierdzenia, transakcja jest w toku).