sql >> Databasteknik >  >> RDS >> Oracle

Oracle Autonomous Transaction Exempel

I Oracle kan en autonom transaktion commit eller rollback data i samma session utan att commitera eller rulla tillbaka i huvudtransaktionen. PRAGMA (kompilatordirektiv) uttalande används för att definiera autonom transaktion i Oracle. Följande är ett exempel på autonoma Oracle-transaktioner.

Syntax för att definiera autonom transaktion i Oracle

PRAGMA AUTONOMOUS_TRANSACTION; /* in the declaration section of PL/SQL Block */

Oracle Stored Procedure Exempel för autonom transaktion

Följande Oracle-lagrade procedur för den autonoma transaktionen är att logga de fel som uppstått i alla PL/SQL-program (procedurer, paket eller funktioner, etc.). Det kommer att infoga felinformationen i tabellen error_log och kommer att överföra data utan att påverka någon huvudtransaktion i något PL/SQL-program. Du kan anropa denna procedur från vilket PL/SQL-program som helst för att logga felinformationen. Nedan ska jag visa dig hur. Skapa följande objekt att testa i ditt system:

Skapa tabellfellogg

CREATE TABLE error_log
(
   error_code          VARCHAR2 (100),
   error_msg           VARCHAR2 (4000),
   date_occurred       DATE,
   plsql_program_ref   VARCHAR2 (100)
)
/

Oracles lagrade procedur för autonom transaktion till loggfel

Proceduren nedan tar tre parametrar som du måste klara av när du anropar proceduren från andra lagrade procedurer eller funktioner vid tidpunkten för felet.

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;
/

Nu kan du anropa den lagrade proceduren prc_log_errors från andra PL/SQL-programs undantagshanteringssektion för att logga felinformationen. Här är ett exempel:

Skapa tabell test_data

CREATE TABLE test_data (some_data VARCHAR2 (100))
/

Skapa funktion fnc_test

Följande funktion kommer att infoga vissa data i test_data tabell, och efter det kommer det att generera felet eftersom det divideras med 0 på nästa rad. Vid fel, i undantagsavsnittet, anropar den proceduren prc_log_errors för att logga felet. Om funktionen körs utan fel kommer den att returnera TRUE annars returnerar den FALSE. I fallet nedan kommer den att returnera FALSK efter att felet har loggats.

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;
/

Testa

Anropa ovanstående funktion fnc_test .

BEGIN
   IF fnc_test
   THEN
      COMMIT;
   ELSE
      ROLLBACK;
   END IF;
EXCEPTION
   WHEN OTHERS
   THEN
      ROLLBACK;
END;
/

Även det återställs vid misslyckande, men ändå kommer data att sparas i error_log-tabellen, eftersom proceduren prc_log_errors använder PRAGMA AUTONOMOUS_TRANSACTION .

Kontrollera test_data-tabellen, bör inte ha några poster.

SELECT * FROM test_data;

Utdata

no rows selected.

Kontrollera data i error_log-tabellen

SELECT * FROM error_log;

Utdata

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

Se även:

  • Oracle PL/SQL Bulk Collect With Save Exception Exemple
  1. Använder PHP 5.5:s password_hash och password_verify-funktion

  2. Hur man identifierar ogiltiga (skadade) värden lagrade i Oracle DATE-kolumner

  3. Hur man korrekt skriver UTF-8-strängar i MySQL via JDBC-gränssnittet

  4. Hur man hittar namnet på en begränsning i SQL Server