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