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

Esempio di transazione autonoma Oracle

In Oracle, una transazione autonoma può eseguire il commit o il rollback dei dati nella stessa sessione senza eseguire il commit o il rollback nella transazione principale. L'istruzione PRAGMA (direttiva del compilatore) viene utilizzata per definire una transazione autonoma in Oracle. Quello che segue è un esempio di transazione autonoma Oracle.

Sintassi per definire una transazione autonoma in Oracle

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

Esempio di procedura memorizzata Oracle per transazione autonoma

La seguente procedura memorizzata Oracle per la transazione autonoma consiste nel registrare gli errori verificatisi in qualsiasi programma PL/SQL (procedure, pacchetti o funzioni, ecc.). Inserisce le informazioni sull'errore nella tabella error_log e salva i dati senza influire su alcuna transazione principale in alcun programma PL/SQL. È possibile chiamare questa procedura da qualsiasi programma PL/SQL per registrare le informazioni sull'errore. Di seguito ti mostrerò come. Crea i seguenti oggetti da testare nel tuo sistema:

Crea registro errori tabella

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

Procedura memorizzata Oracle per la transazione autonoma per registrare gli errori

Di seguito la procedura accetta tre parametri, che devi passare al momento della chiamata della procedura da altre procedure o funzioni memorizzate al momento dell'errore.

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

Ora puoi chiamare la stored procedure prc_log_errors dalla sezione di gestione delle eccezioni di un altro programma PL/SQL per registrare le informazioni sull'errore. Ecco un esempio:

Crea tabella test_data

CREATE TABLE test_data (some_data VARCHAR2 (100))
/

Crea funzione fnc_test

La seguente funzione inserirà alcuni dati nei test_data tabella e, successivamente, genererà l'errore perché sta dividendo per 0 nella riga successiva. In caso di errore, nella sezione delle eccezioni, chiama la procedura prc_log_errors per registrare l'errore. Se la funzione viene eseguita senza errori, restituirà TRUE altrimenti restituirà FALSE. Nel caso seguente, restituirà FALSE dopo aver registrato l'errore.

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

Chiama la funzione sopra fnc_test .

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

Anche se si esegue il rollback in caso di errore, i dati verranno comunque salvati nella tabella error_log, poiché la procedura prc_log_errors sta utilizzando PRAGMA AUTONOMOUS_TRANSACTION .

Controlla la tabella test_data, non dovrebbe avere record.

SELECT * FROM test_data;

Uscita

no rows selected.

Controlla i dati nella tabella error_log

SELECT * FROM error_log;

Uscita

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

Vedi anche:

  • Esempio di raccolta in blocco Oracle PL/SQL con eccezioni di salvataggio