sql >> Database >  >> RDS >> Oracle

Voorbeeld van autonome transactie van Oracle

In Oracle kan een autonome transactie de gegevens in dezelfde sessie vastleggen of terugdraaien zonder in de hoofdtransactie vast te leggen of terug te draaien. De PRAGMA-verklaring (compilerrichtlijn) wordt gebruikt om autonome transacties in Oracle te definiëren. Het volgende is een voorbeeld van een autonome Oracle-transactie.

Syntaxis om autonome transactie in Oracle te definiëren

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

Oracle Stored Procedure Voorbeeld voor Autonome Transactie

De volgende Oracle-opgeslagen procedure voor de autonome transactie is het loggen van de fouten die zijn opgetreden in elk PL/SQL-programma (procedures, pakketten of functies, enz.). Het zal de foutinformatie invoegen in de tabel error_log en zal de gegevens vastleggen zonder enige hoofdtransactie in een PL/SQL-programma te beïnvloeden. U kunt deze procedure vanuit elk PL/SQL-programma aanroepen om de foutinformatie te loggen. Hieronder laat ik je zien hoe. Maak de volgende objecten om in uw systeem te testen:

Tabel maken Error_Log

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

Opgeslagen Oracle-procedure voor autonome transactie om fouten te loggen

De onderstaande procedure heeft drie parameters nodig, die u moet doorgeven op het moment dat u de procedure aanroept vanuit andere opgeslagen procedures of functies op het moment van de fout.

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 kunt u de opgeslagen procedure prc_log_errors . aanroepen uit de uitzonderingsbehandelingssectie van andere PL/SQL-programma's om de foutinformatie te loggen. Hier is een voorbeeld:

Tabel test_data maken

CREATE TABLE test_data (some_data VARCHAR2 (100))
/

Functie maken fnc_test

De volgende functie zal wat gegevens invoegen in de test_data tabel, en daarna zal het de fout genereren omdat het wordt gedeeld door 0 in de volgende regel. Bij een fout roept het in de uitzonderingssectie de procedure prc_log_errors . aan om de fout te loggen. Als de functie foutloos wordt uitgevoerd, wordt TRUE geretourneerd, anders wordt FALSE geretourneerd. In het onderstaande geval zal het FALSE retourneren na het loggen van de fout.

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

Roep de bovenstaande functie fnc_test . aan .

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

Zelfs als het terugdraait als het mislukt, worden de gegevens toch opgeslagen in de tabel error_log, omdat de procedure prc_log_errors gebruikt PRAGMA AUTONOMOUS_TRANSACTION .

Controleer de test_data-tabel, mag geen records bevatten.

SELECT * FROM test_data;

Uitvoer

no rows selected.

Controleer gegevens in de tabel error_log

SELECT * FROM error_log;

Uitvoer

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

Zie ook:

  • Oracle PL/SQL Bulk Collect met voorbeeld opslaan uitzonderingen
  1. docker postgres met initiële gegevens wordt niet bewaard tijdens commits

  2. Hoe MySQL-replicatie in te stellen in RHEL, Rocky en AlmaLinux

  3. SQL Server Clustering vanuit een Oracle RAC-perspectief

  4. Forceer Oracle Drop Global Temp Table