Hoy vamos a ver como facilitarnos un poco el control del código de aplicación de la base de datos.
En muchas ocasiones, los desarrolladores no llevan a cabo correctamente la captura de errores , lo que produce una serie quejas «no me va y no me da error».
Para lidiar con estas situaciones podemos crear un pequeño trigger que registre en la base de datos que y quien genera errores en la base de datos, para poder seguirlos y depurar estos errores.
Vamos a suponer que:
- Tenemos un tablespace específico llamado CONTROL donde guardaremos nuestros datos
- Tenemos un usuario llamado CONTROL que será el propietario del código
Primero crearemos la tabla que contendrán los errores:
-- Creamos la tabla
create table CONTROL.oraerror (
identificador NUMBER,
FECHA DATE,
ESQUEMA VARCHAR2(30),
USUARIO VARCHAR2(50),
SQL_ID VARCHAR2 (13) DEFAULT NULL,
SQL_HASH_VALUE NUMBER DEFAULT NULL,
err_nr NUMBER(10),
err_msg VARCHAR2(4000),
stmt CLOB
) TABLESPACE CONTROL;
--
-- Creamos una secuencia para el oraerror
create sequence CONTROL.oraerror_seq
start with 1
increment by 1
minvalue 1
nomaxvalue
nocache
nocycle;
Y después crearemos nuestro trigguer
CREATE OR REPLACE TRIGGER CONTROL.after_error
AFTER SERVERERROR ON DATABASE
DECLARE
id NUMBER;
vSerial NUMBER DEFAULT NULL;
ESQUEMA VARCHAR2(30);
USUARIO VARCHAR2(50);
SQL_ID VARCHAR2 (13) DEFAULT NULL;
SQL_HASH_VALUE NUMBER DEFAULT NULL;
sql_text ORA_NAME_LIST_T;
v_stmt CLOB;
n NUMBER;
vsid NUMBER DEFAULT NULL;
BEGIN
-- BUscamos ID
SELECT dbms_debug_jdwp.current_session_serial serial# INTO vSerial
FROM DUAL;
SELECT oraerror_seq.nextval,SYS_CONTEXT ('USERENV', 'sid') INTO id, vsid
FROM dual;
SELECT SQL_ID, SQL_HASH_VALUE,USERNAME,OSUSER INTO SQL_ID, SQL_HASH_VALUE,ESQUEMA,USUARIO
FROM sys.v_$session WHERE sid = vsid AND serial# = vSerial;
n:= ora_sql_txt(sql_text);
IF n >= 1
THEN
FOR i IN 1..n LOOP
v_stmt := v_stmt || sql_text(i);
END LOOP;
END IF;
--
FOR n IN 1..ora_server_error_depth LOOP
INSERT /*+ APPEND */
INTO CONTROL.oraerror VALUES(id, sysdate, ESQUEMA, USUARIO, SQL_ID,SQL_HASH_VALUE, ora_server_error(n), ora_server_error_msg(n), v_stmt);
END LOOP;
--
END ;
Con esto tendrémos en nuestra tabla todos los errores que dela base de datos.
Hay que tener en cuenta que, muchos de los errores pueden ser correctos, como los errores :
- ORA-01017: nombre de usuario/contraseña no válidos; conexión denegada
- ORA-00001: unique constraint (XXXX) violated (error asumible en cargas masivas)
- ORA-03113: end-of-file on communication channel ORA-03113: end-of-file on communication channel
Con lo que habrá que seguirlos con cuidado y ver en que caso son reprochables o asumibles