Sie haben einige andere Teile des Buches verpasst. Ja, Steven stimmt – wenn in einem Block eine Ausnahme auftritt, bleiben alle vorhergehenden DML-Effekte bestehen. Es sollte jedoch eine andere Erwähnung in dem Buch geben, dass die Ausführung einer beliebigen SQL- oder PL/SQL-Anweisung (d. h. auch eines anonymen Blocks) auf oberster Ebene einen Cursor für diese Anweisung öffnet und wenn während der Ausführung des Cursors eine Ausnahme auftritt, alle DML-Effekte ausgeführt werden während der Ausführung des Cursors zurückgesetzt werden. Vielleicht gibt Ihnen ein einfaches Beispiel den Hinweis...
In Ihrem ursprünglichen Beispiel haben Sie ...
ausgeführtBEGIN
DELETE FROM dml_exception;
raise value_error;
END;
... als oberste Aussage. Ja, am Ende des Blocks, obwohl noch innerhalb, Ihr delete
Effekte blieben bestehen. Ihr Block hat jedoch eine Ausnahme ausgelöst, die bis zum Cursor der obersten Ebene weitergegeben wurde. Um also die Prinzipien der Atomizität
einzuhalten , Oracle hat alle ausstehenden Effekte des geöffneten Cursors rückgängig gemacht.
Wenn Sie Ihren PL/SQL-Block aus einem anderen PL/SQL-Block der obersten Ebene heraus aufrufen, der die im PL/SQL-Block der unteren Ebene ausgelöste Ausnahme behandelt und nicht erneut auslöst, ...
BEGIN
BEGIN
DELETE FROM dml_exception;
raise value_error;
END;
EXCEPTION
WHEN others THEN NULL;
END;
..., dann Ihr delete
Wirkungen bleiben bestehen. (Und da in diesem Block kein Commit vorhanden ist, haben Sie am Ende eine Transaktion im Gange.)