Saltar al contenido

Transacciones aut贸nomas en ORACLE

A veces, es necesario que una parte de las transacciones se graben, independientemente de si el resto ha dado error. Por ejemplo, si queremos guardar un registro de los errores producidos en un procedimiento que inserta varios registros en una tabla y tiene controlados los fallos con un rollback.

Esto聽se consigue marcando el bloque PLSQL con PRAGMA AUTONOMOUS_TRANSACTION. Con esta directiva conseguimos que las transacciones se comporten de manera diferente al principal. Mejor lo vemos con un ejemplo.

Creamos dos tablas:

create table PRUEBA (nombre varchar2(1));
create table PRUEBA_LOG (descripcion varchar2(200), fecha date);

Ahora un procedimiento que grabar谩 en un tabla de errores los registros que no insertemos y un bloque que insertar谩 registros del 1 al 10 enPRUEBA. El 煤ltimo registro (10) fallar谩 porque聽la longitud del campo es de 1.

聽CREATE OR REPLACE PROCEDURE ERR_LOG(VALOR VARCHAR2)
聽IS
PRAGMA AUTONOMOUS_TRANSACTION;
聽BEGIN
聽INSERT INTO PRUEBA_LOG
聽(DESCRIPCION, FECHA)
聽VALUES
聽(VALOR, SYSDATE);
聽COMMIT;
聽END;
/
BEGIN
聽 INSERT INTO PRUEBA
聽 SELECT level聽 FROM dual
聽 CONNECT BY level <= 10;
聽 COMMIT;
EXCEPTION
聽 WHEN OTHERS THEN
聽聽聽 ERR_LOG(SQLERRM);
聽聽聽 ROLLBACK;
END;

Al terminar de ejecutar el proceso, hacemos una select de la tabla de errores y nos devuelve esto:

SQL> select * from PRUEBA_LOG;

ORA-12899: value too large for column 鈥淢ANTE90鈥.鈥漃RUEBA鈥.鈥漀OMBRE鈥 (actual: 2, ma
ximum: 1)
06-AGO-2010

Como veis el commit del procedimiento actua de manera independiente al bloque. Y ha podido realizar el commit cuando el registro ha fallado ya que esta marcado como una transacci贸n aut贸noma.

Es un peque帽o ejemplo para guardar un log sobre registros que falla, pero si ya estais trabajando con Oracle10g, es mucho mejor trabajar con el paquete DML ERROR LOGGING. Echadle un ojo si os interesa (est谩 posteado en esta p谩gina).