Unikly vám některé další části knihy. Ano, Steven má pravdu – pokud se v bloku vyskytne výjimka, všechny předchozí efekty DML zůstanou na svém místě. Přesto by v knize měla být další zmínka o tom, že každé provedení příkazu SQL nebo PL/SQL na nejvyšší úrovni (tedy i anonymního bloku) otevře kurzor pro tento příkaz, a pokud během provádění kurzoru dojde k výjimce, všechny efekty DML jsou hotové. během provádění kurzoru jsou vráceny zpět. Snad vám napoví jednoduchý příklad...
V původním příkladu jste provedli ...
BEGIN
DELETE FROM dml_exception;
raise value_error;
END;
... jako prohlášení nejvyšší úrovně. Ano, na konci bloku, i když stále uvnitř, vaše delete
efekty zůstaly na svém místě. Přesto váš blok vyvolal výjimku, která se rozšířila až ke kurzoru nejvyšší úrovně. Abychom tedy dodrželi zásady atomicity
, Oracle vrátil všechny nevyřízené efekty otevřeného kurzoru.
Pokud zavoláte svůj blok PL/SQL z jiného bloku PL/SQL nejvyšší úrovně, který zpracovává a znovu nevyvolává výjimku vyvolanou v bloku PL/SQL nižší úrovně, ...
BEGIN
BEGIN
DELETE FROM dml_exception;
raise value_error;
END;
EXCEPTION
WHEN others THEN NULL;
END;
... a poté vaše delete
účinky zůstanou na svém místě. (A protože v tomto bloku není žádné potvrzení, skončíte s probíhající transakcí.)