Je miste een aantal andere delen van het boek. Ja, Steven is waar - als er een uitzondering optreedt in een blok, blijven alle voorgaande DML-effecten op hun plaats. Toch zou er in het boek moeten worden vermeld dat elke uitvoering van een SQL- of PL/SQL-instructie op het hoogste niveau (d.w.z. ook anoniem blok) een cursor voor die instructie opent en als er een uitzondering is tijdens de uitvoering van de cursor, worden alle DML-effecten uitgevoerd tijdens de uitvoering van de cursor worden teruggedraaid. Misschien geeft een eenvoudig voorbeeld u de aanwijzing...
In uw oorspronkelijke voorbeeld voerde u ...
. uitBEGIN
DELETE FROM dml_exception;
raise value_error;
END;
... als de verklaring van het hoogste niveau. Ja, aan het einde van het blok, maar nog steeds binnen, je delete
effecten bleven bestaan. Toch veroorzaakte je blok een uitzondering die helemaal tot aan de cursor op het hoogste niveau werd gepropageerd. Dus, om te voldoen aan de principes van atomiciteit
, Oracle heeft alle wachtende effecten van de geopende cursor teruggedraaid.
Als u uw PL/SQL-blok aanroept vanuit een ander PL/SQL-blok op het hoogste niveau, dat de uitzondering verwerkt en niet opnieuw verhoogt in het PL/SQL-blok op het lagere niveau, ...
BEGIN
BEGIN
DELETE FROM dml_exception;
raise value_error;
END;
EXCEPTION
WHEN others THEN NULL;
END;
..., dan je delete
effecten blijven bestaan. (En aangezien er geen vastlegging is in dat blok, heb je uiteindelijk een transactie in uitvoering.)