sql >> Base de Datos >  >> RDS >> Oracle

Ejemplo de transacción autónoma de Oracle

En Oracle, una transacción autónoma puede comprometer o revertir los datos en la misma sesión sin comprometer o revertir en la transacción principal. La instrucción PRAGMA (directiva del compilador) se utiliza para definir transacciones autónomas en Oracle. El siguiente es un ejemplo de transacción autónoma de Oracle.

Sintaxis para definir transacciones autónomas en Oracle

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

Ejemplo de procedimiento almacenado de Oracle para transacciones autónomas

El siguiente procedimiento almacenado de Oracle para la transacción autónoma es registrar los errores ocurridos en cualquier programa PL/SQL (Procedimientos, paquetes o funciones, etc.). Insertará la información del error en la tabla error_log y confirmará los datos sin afectar ninguna transacción principal en ningún programa PL/SQL. Puede llamar a este procedimiento desde cualquier programa PL/SQL para registrar la información del error. A continuación te mostraré cómo. Cree los siguientes objetos para probarlos en su sistema:

Crear tabla Error_Log

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

Procedimiento almacenado de Oracle para transacciones autónomas para registrar errores

El siguiente procedimiento toma tres parámetros, que debe pasar al momento de llamar al procedimiento desde otros procedimientos o funciones almacenados en el momento del error.

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

Ahora puede llamar al procedimiento almacenado prc_log_errors de la sección de manejo de excepciones de otro programa PL/SQL para registrar la información del error. Aquí hay un ejemplo:

Crear tabla test_data

CREATE TABLE test_data (some_data VARCHAR2 (100))
/

Crear función fnc_test

La siguiente función insertará algunos datos en test_data table, y después de eso, generará el error porque está dividiendo por 0 en la siguiente línea. En caso de error, en la sección de excepciones, está llamando al procedimiento prc_log_errors para registrar el error. Si la función se ejecuta sin error, devolverá VERDADERO, de lo contrario devolverá FALSO. En el caso a continuación, devolverá FALSO después de registrar el error.

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

Prueba

Llame a la función anterior fnc_test .

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

Incluso se revierte en caso de falla, pero aún así, los datos se guardarán en la tabla error_log, porque el procedimiento prc_log_errors está usando PRAGMA AUTONOMOUS_TRANSACTION .

Verifique la tabla test_data, no debería tener registros.

SELECT * FROM test_data;

Salida

no rows selected.

Comprueba los datos en la tabla error_log

SELECT * FROM error_log;

Salida

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

Véase también:

  • Oracle PL/SQL Bulk Collect with Save Exceptions Example