Ti sei perso altre parti del libro. Sì, Steven è vero:se si verifica un'eccezione in un blocco, tutti gli effetti DML precedenti rimangono attivi. Tuttavia, ci dovrebbe essere un'altra menzione nel libro che qualsiasi esecuzione di istruzioni SQL o PL/SQL di primo livello (cioè anche blocco anonimo) apre un cursore per quell'istruzione e se c'è un'eccezione durante l'esecuzione del cursore, tutti gli effetti DML vengono eseguiti durante l'esecuzione del cursore vengono ripristinati. Forse un semplice esempio ti darà l'indizio...
Nel tuo esempio originale, hai eseguito ...
BEGIN
DELETE FROM dml_exception;
raise value_error;
END;
... come l'affermazione di primo livello. Sì, alla fine del blocco, anche se ancora all'interno, il tuo delete
gli effetti sono rimasti in vigore. Tuttavia, il tuo blocco ha sollevato un'eccezione che è stata propagata fino al cursore di livello superiore. Pertanto, al fine di aderire ai principi di atomicità
, Oracle ha eseguito il rollback di tutti gli effetti in sospeso del cursore aperto.
Se chiami il tuo blocco PL/SQL dall'interno di un altro blocco PL/SQL di livello superiore, che gestisce e non solleva nuovamente l'eccezione sollevata nel blocco PL/SQL di livello inferiore, ...
BEGIN
BEGIN
DELETE FROM dml_exception;
raise value_error;
END;
EXCEPTION
WHEN others THEN NULL;
END;
..., quindi il tuo delete
gli effetti restano in vigore. (E poiché non c'è alcun commit in quel blocco, finisci per avere una transazione in corso.)