Oracle
 sql >> Database >  >> RDS >> Oracle

DML e gestione delle eccezioni - Oracle

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.)