Zu Oracle

Bereich:
Versionsinfo:
PL/SQL
9.2, 10.2, 11.
Erstellung:
Letzte Überarbeitung:
02/2001 HA
06/2009 EF
 Als PDF Downloaden!

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:

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

 

Suche

Kontakt

Telefon:
  089 6228 6789-0

Telefon (noch gültig):
  089 679090-40

E-Mail Verteiler Monatstipps

Bitte nehmen Sie mich in den Verteiler der monatlichen Tipps & Tricks auf.