Oracle
 sql >> Datenbank >  >> RDS >> Oracle

DML und Ausnahmebehandlung – Oracle

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ührt
BEGIN
    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.)