sql >> Database teknologi >  >> RDS >> Oracle

Oracle Autonomous Transaction Eksempel

I Oracle kan en autonom transaktion begå eller rulle tilbage dataene i samme session uden at begå eller rulle tilbage i hovedtransaktionen. PRAGMA (compiler direktiv) erklæring bruges til at definere autonom transaktion i Oracle. Følgende er et eksempel på en autonom Oracle-transaktion.

Syntaks til at definere autonom transaktion i Oracle

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

Oracle Stored Procedure Eksempel for Autonom Transaction

Den følgende Oracle-lagrede procedure for den autonome transaktion er at logge de fejl, der er opstået i ethvert PL/SQL-program (Procedurer, pakker eller funktioner osv.). Det vil indsætte fejlinformationen i tabellen error_log og vil begå dataene uden at påvirke nogen hovedtransaktion i noget PL/SQL-program. Du kan kalde denne procedure fra ethvert PL/SQL-program for at logge fejlinformationen. Nedenfor vil jeg vise dig hvordan. Opret følgende objekter for at teste i dit system:

Opret tabelfejllog

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

Oracle Stored Procedure for autonom transaktion til log-fejl

Nedenstående procedure tager tre parametre, som du skal passere, når du kalder proceduren fra andre lagrede procedurer eller funktioner på tidspunktet for fejlen.

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 kalde den lagrede procedure prc_log_errors fra andre PL/SQL-programmers undtagelseshåndteringssektion for at logge fejlinformationen. Her er et eksempel:

Opret tabel test_data

CREATE TABLE test_data (some_data VARCHAR2 (100))
/

Opret funktion fnc_test

Den følgende funktion vil indsætte nogle data i test_data tabel, og derefter vil den generere fejlen, fordi den dividerer med 0 i næste linje. Ved fejl, i undtagelsessektionen, kalder den proceduren prc_log_errors for at logge fejlen. Hvis funktionen udføres uden fejl, vil den returnere TRUE, ellers vil den returnere FALSK. I nedenstående tilfælde vil den returnere FALSK efter at have logget fejlen.

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

Kald ovenstående funktion fnc_test .

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

Selv det ruller tilbage ved fejl, men stadig vil dataene blive gemt i error_log-tabellen, fordi proceduren prc_log_errors bruger PRAGMA AUTONOMOUS_TRANSACTION .

Tjek test_data-tabellen, bør ikke have nogen poster.

SELECT * FROM test_data;

Output

no rows selected.

Tjek data i error_log-tabellen

SELECT * FROM error_log;

Output

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 også:

  • Oracle PL/SQL-masseindsamling med eksempel på Gem undtagelser
  1. Indstil tidszone i PHP og MySQL

  2. ORA-00932:inkonsistente datatyper:forventet - fik CLOB

  3. ACID-egenskaberne for erklæringer og transaktioner

  4. MAX() – Find den maksimale værdi i en kolonne i MySQL