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

Beispiel für eine autonome Oracle-Transaktion

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