Du gik glip af nogle andre dele af bogen. Ja, Steven er sandt – hvis der opstår en undtagelse i en blok, forbliver alle foregående DML-effekter på plads. Alligevel bør der være en anden omtale i bogen, at enhver SQL- eller PL/SQL-sætning på øverste niveau (dvs. også anonym blokering) åbner en markør for den sætning, og hvis der er en undtagelse under markørens udførelse, udføres alle DML-effekter under markørens udførelse rulles tilbage. Måske vil et simpelt eksempel give dig et fingerpeg...
I dit originale eksempel udførte du ...
BEGIN
DELETE FROM dml_exception;
raise value_error;
END;
... som erklæring på øverste niveau. Ja, i slutningen af blokken, men stadig inden for, din delete
effekter forblev på plads. Alligevel rejste din blokering en undtagelse, som blev spredt helt op til markøren på øverste niveau. For således at overholde principperne for atomicitet
, Oracle rullede alle ventende effekter af den åbnede markør tilbage.
Hvis du kalder din PL/SQL-blok inde fra en anden PL/SQL-blok på øverste niveau, som håndterer og ikke re-hæver undtagelsen, der er rejst i PL/SQL-blokken på lavere niveau, ...
BEGIN
BEGIN
DELETE FROM dml_exception;
raise value_error;
END;
EXCEPTION
WHEN others THEN NULL;
END;
..., derefter din delete
virkningerne forbliver på plads. (Og da der ikke er nogen commit i den blok, ender du med at have en transaktion i gang.)