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