In Oracle kann eine autonome Transaktion die Daten in derselben Sitzung festschreiben oder rückgängig machen, ohne die Haupttransaktion festzuschreiben oder rückgängig zu machen. Die PRAGMA-Anweisung (Compiler-Direktive) wird verwendet, um autonome Transaktionen in Oracle zu definieren. Das Folgende ist ein Beispiel für eine autonome Oracle-Transaktion.
Syntax zum Definieren autonomer Transaktionen in Oracle
PRAGMA AUTONOMOUS_TRANSACTION; /* in the declaration section of PL/SQL Block */
Oracle Stored Procedure Beispiel für autonome Transaktion
Die folgende gespeicherte Oracle-Prozedur für die autonome Transaktion dient zum Protokollieren der Fehler, die in einem beliebigen PL/SQL-Programm (Prozeduren, Pakete oder Funktionen usw.) aufgetreten sind. Es fügt die Fehlerinformationen in die Tabelle error_log ein und schreibt die Daten fest, ohne eine Haupttransaktion in einem beliebigen PL/SQL-Programm zu beeinflussen. Sie können diese Prozedur von jedem PL/SQL-Programm aus aufrufen, um die Fehlerinformationen zu protokollieren. Im Folgenden zeige ich Ihnen, wie. Erstellen Sie die folgenden Objekte zum Testen in Ihrem System:
Tabelle Error_Log erstellen
CREATE TABLE error_log ( error_code VARCHAR2 (100), error_msg VARCHAR2 (4000), date_occurred DATE, plsql_program_ref VARCHAR2 (100) ) /
Oracle Stored Procedure for Autonomous Transaction to Log Errors
Die folgende Prozedur benötigt drei Parameter, die Sie zum Zeitpunkt des Aufrufs der Prozedur von anderen gespeicherten Prozeduren oder Funktionen zum Zeitpunkt des Fehlers übergeben müssen.
CREATE OR REPLACE PROCEDURE prc_log_errors (v_error_code IN VARCHAR2, v_error_msg IN VARCHAR2, v_plsql_program IN VARCHAR2) AS PRAGMA AUTONOMOUS_TRANSACTION; BEGIN INSERT INTO error_log (ERROR_CODE, ERROR_MSG, DATE_OCCURRED, PLSQL_PROGRAM_REF) VALUES (v_error_code, v_error_msg, SYSDATE, v_plsql_program); COMMIT; END; /
Jetzt können Sie die gespeicherte Prozedur prc_log_errors aufrufen aus dem Ausnahmebehandlungsabschnitt eines anderen PL/SQL-Programms, um die Fehlerinformationen zu protokollieren. Hier ist ein Beispiel:
Tabelle test_data erstellen
CREATE TABLE test_data (some_data VARCHAR2 (100)) /
Funktion fnc_test erstellen
Die folgende Funktion fügt einige Daten in die test_data ein Tabelle, und danach wird der Fehler generiert, weil es in der nächsten Zeile durch 0 dividiert wird. Bei einem Fehler wird im Ausnahmeabschnitt die Prozedur prc_log_errors aufgerufen um den Fehler zu protokollieren. Wenn die Funktion ohne Fehler ausgeführt wird, gibt sie TRUE zurück, andernfalls gibt sie FALSE zurück. Im folgenden Fall wird nach dem Protokollieren des Fehlers FALSE zurückgegeben.
CREATE OR REPLACE FUNCTION fnc_test RETURN BOOLEAN IS n NUMBER; BEGIN INSERT INTO test_data VALUES ('abc'); /* generate error */ n := 2 / 0; RETURN TRUE; EXCEPTION WHEN OTHERS THEN prc_log_errors (TO_CHAR (SQLCODE), SQLERRM, 'FNC_TEST'); RETURN FALSE; END fnc_test; /
Test
Rufen Sie die obige Funktion fnc_test auf .
BEGIN IF fnc_test THEN COMMIT; ELSE ROLLBACK; END IF; EXCEPTION WHEN OTHERS THEN ROLLBACK; END; /
Auch bei einem Fehler wird ein Rollback durchgeführt, aber die Daten werden trotzdem in der error_log-Tabelle gespeichert, da die Prozedur prc_log_errors verwendet PRAGMA AUTONOMOUS_TRANSACTION .
Überprüfen Sie die Tabelle test_data, es sollten keine Datensätze vorhanden sein.
SELECT * FROM test_data;
Ausgabe
no rows selected.
Überprüfen Sie die Daten in der error_log-Tabelle
SELECT * FROM error_log;
Ausgabe
ERROR_CODE ERROR_MSG DATE_OCCURRED PLSQL_PROGRAM_REF -1476 ORA-01476: divisor is equal to zero 27/03/2019 15:43:12 FNC_TEST
Siehe auch:
- Beispiel für Oracle PL/SQL-Massenerfassung mit Speicherausnahmen