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

Rollback in PLSQL-Ausnahme

Erstens gehe ich davon aus, dass wir die Syntaxfehler ignorieren können (z. B. gibt es kein END LOOP , die dbms_output.put_line call fehlt das erste einfache Anführungszeichen usw.)

Ob Änderungen rückgängig gemacht werden müssen, hängt davon ab.

Im Allgemeinen würden Sie keine zwischenzeitlichen Commits in einer Schleife haben. Das ist im Allgemeinen eine schlechte Architektur, sowohl weil sie in Bezug auf I/O und verstrichene Zeit viel kostspieliger ist. Es macht es auch viel schwieriger, neu startbaren Code zu schreiben. Was passiert zum Beispiel, wenn Sie SELECT -Anweisung 10 Zeilen auswählt, Sie 5 Updates ausgeben (und festschreiben) und dann das 6. Update fehlschlägt? Die einzige Möglichkeit, mit der 6. Zeile neu zu starten, nachdem Sie die Ausnahme behoben haben, wäre eine separate Tabelle, in der Sie den Fortschritt Ihres Codes gespeichert (und aktualisiert) haben. Es schafft auch Probleme für jeden Code, der diesen Block aufruft, der dann den Fall handhaben muss, dass die Hälfte der Arbeit erledigt (und festgeschrieben) wurde und die andere Hälfte nicht.

Im Allgemeinen würden Sie Transaktionssteuerungsanweisungen nur in die äußersten Blöcke Ihres Codes einfügen. Da ein COMMIT oder ein ROLLBACK in einer Prozedur jede in der Sitzung ausgeführte Arbeit festschreibt oder zurücksetzt, unabhängig davon, ob sie von der Prozedur ausgeführt wurde oder nicht, sollten Sie beim Hinzufügen von Transaktionssteuerungsanweisungen sehr vorsichtig sein. Im Allgemeinen möchten Sie, dass der Aufrufer entscheidet, ob ein Commit oder ein Rollback ausgeführt werden soll. Natürlich geht das nur bis zu einem gewissen Punkt – schließlich werden Sie im äußersten Block sein, der niemals von einer anderen Routine aufgerufen wird, und Sie müssen über eine angemessene Transaktionskontrolle verfügen – aber es ist etwas, womit Sie sehr vorsichtig sein müssen darüber, ob Sie Code schreiben, der wiederverwendet werden könnte.

Da Sie in diesem Fall vorläufige Commits haben, ist die einzige Auswirkung Ihres ROLLBACK wäre, dass, wenn die erste Update-Anweisung fehlschlägt, die Arbeit, die in Ihrer Sitzung vor dem Aufruf dieses Blocks erledigt wurde, rückgängig gemacht wird. Die vorläufige Festschreibung würde diese vorherigen Änderungen festschreiben, wenn die erste Aktualisierungsanweisung erfolgreich war. Das ist die Art von Nebeneffekt, über den sich Leute Sorgen machen, wenn sie darüber sprechen, warum vorläufige Festschreibungen und Transaktionskontrolle in wiederverwendbaren Blöcken problematisch sind.