Als PDF Downloaden!
Transcription
Als PDF Downloaden!
Tipps & Tricks: Autonome Transaktionen Bereich: PL/SQL Erstellung: 02/2001 HA Versionsinfo: 9.2, 10.2, 11. Letzte Überarbeitung: 06/2009 EF Autonomous_Transaction Das Pragma Autonomous_Transaction kann bei allen PL/SQL-Routinen, einschließlich Triggern angegeben werden, in anonymen Blöcken allerdings nur in der obersten Ebene. Autonome Transaktionen laufen innerhalb einer Haupttransaktion eigenständig ab (die Haupttransaktion wird währenddessen gestoppt und läuft erst weiter, wenn die autonome Transaktion abgeschlossen ist). Ein Commit (oder Rollback) innerhalb der Routine betrifft keine DML-Befehle der aufrufenden Umgebung! Dadurch wird beispielsweise auch ein Commit in einem Trigger möglich. Weil autonome Transaktionen separat von der Haupttransaktion ablaufen, können sie den aktuellen Status der geänderten Zeilen nicht sehen. Es scheint so, als befänden sie sich in einer separaten Sitzung. Dagegen kann die Haupttransaktion die Ergebnisse einer bereits festgeschriebenen autonomen Transaktion sehen. Autonome Transaktionen werden häufig in der Fehlerbehandlung eingesetzt, um Fehlermeldungen in Error-Logs festzuhalten, wenn die Haupttransaktion zurückgerollt werden muss. Da autonome Transaktionen in Subblöcken nicht erlaubt sind, muss man hier erst eine Prozedur erstellen, die man dann im Exception-Teil aufrufen kann. vereinfachtes Beispiel: Erstellung eines Error-Logs: CREATE TABLE fehler_tab ( fehler_nr NUMBER(10) PRIMARY KEY, zeitpunkt TIMESTAMP, fehlermeldung VARCHAR2(512)); Erstellung einer Sequenz für die Fehlernummer: CREATE SEQUENCE fehler_seq; Erstellung der Fehlerprozedur: CREATE OR REPLACE PROCEDURE log_error(p_fehler IN VARCHAR2) AS PRAGMA AUTONOMOUS_TRANSACTION; BEGIN INSERT INTO fehler_tab (fehler_nr, zeitpunkt, fehlermeldung) VALUES (fehler_seq.nextval, systimestamp, p_fehler); COMMIT; END; Aufruf in einem Exception-Teil: Muniqsoft GmbH Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40 IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0 Seite 1 von 2 BEGIN -- die empno 7839 ist schon vorhanden INSERT INTO emp(empno, ename) VALUES(7839, 'PRINCE'); EXCEPTION WHEN OTHERS THEN log_error(p_fehler => SQLERRM); ROLLBACK; RAISE; END; --Ausgabe: FEHLER in Zeile 1: ORA-00001: Unique Constraint (SCOTT.PK_EMP) verletzt ORA-06512: in Zeile 7 SELECT * FROM emp; -> keine Änderung SELECT * FROM fehler_tab; FEHLER_NR ZEITPUNKT FEHLERMELDUNG ---------- ------------------------ ----------------1 22.06.09 11:44:34,312000 ORA-00001: Unique Constraint (SCOTT.PK_EMP) verletzt Muniqsoft GmbH Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40 IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0 Seite 2 von 2