En este artículo:
https://firebird21.wordpress.com/2013/06/26/registrando-errores-en-una-tabla-de-log/
hemos visto como registrar errores en una tabla de log, el ejemplo allí mostrado usaba un trigger, ahora veremos uno similar pero usando un stored procedure y explicando más detenidamente como funciona:
SET TERM ^ ; CREATE PROCEDURE EXISTE_RETENCION( tnCodSuc D_CODIGOSUCURSAL, tcRetNro D_NOMBRE15) RETURNS( tlRetencionExiste TYPE OF D_BOOLEAN) AS DECLARE VARIABLE lcTemp TYPE OF COLUMN RETENCIONESCAB.RTC_NUMERO; BEGIN IN AUTONOMOUS TRANSACTION DO BEGIN INSERT INTO LOG (LOG_TABLAX, LOG_STOPXX, LOG_VALORX) VALUES('RETENCIONESCAB', 1, 'Aquí empieza el stored procedure EXISTE_RETENCION'); END lcTemp = (SELECT COALESCE(R.RTC_NUMERO, '') FROM RETENCIONESCAB R WHERE R.RTC_CODSUC = :tnCodSuc AND R.RTC_NUMERO = :tcRetNro); IN AUTONOMOUS TRANSACTION DO BEGIN INSERT INTO LOG (LOG_TABLAX, LOG_STOPXX, LOG_VALORX) VALUES('RETENCIONESCAB', 2, 'lcTemp = ' || lcTemp); END tlRetencionExiste = 'F'; IF (tcRetNro = lcTemp) THEN tlRetencionExiste = 'T'; IN AUTONOMOUS TRANSACTION DO BEGIN INSERT INTO LOG (LOG_TABLAX, LOG_STOPXX, LOG_VALORX) VALUES('RETENCIONESCAB', 3, 'tlRetencionExiste = ' || tlRetencionExiste); END IN AUTONOMOUS TRANSACTION DO BEGIN INSERT INTO LOG (LOG_TABLAX, LOG_STOPXX, LOG_VALORX) VALUES('RETENCIONESCAB', 4, 'Fin del stored procedure EXISTE_RETENCION'); END END^ SET TERM ; ^
En este stored procedure tenemos cuatro IN AUTONOMOUS TRANSACTION y en cada uno de ellos un INSERT INTO LOG. Si se desea, se pueden tener varios INSERT INTO LOG dentro de un IN AUTONOMOUS TRANSACTION.
Los valores que guardamos en las columnas LOG_TABLAX, LOG_STOPXX y LOG_VALORX pueden ser cualesquiera, lo único importante es que en LOG_TABLAX y en LOG_VALORX guardemos caracteres y en LOG_STOPXX guardemos un número.
El Firebird automáticamente hace el COMMIT de la transacción autónoma cuando se llega al END de la misma. No importa si la transacción principal terminó con un COMMIT o con un ROLLBACK, la transacción autónoma siempre termina con un COMMIT, o sea que a la tabla de LOG siempre se le insertan filas.
IN AUTONOMOUS TRANSACTION puede ser escrito en cualquier parte dentro del stored procedure o del trigger
A tu usuario debes asignarle derechos de INSERT y de SELECT de la tabla LOG, para que puedas ver su contenido
Todos los comandos que escribas dentro de IN AUTONOMOUS TRANSACTION deben finalizar con un punto y coma
El END de IN AUTONOMOUS TRANSACTION no debe finalizar con un punto y coma
Artículos relacionados:
Registrando errores en una tabla de LOG
El índice del blog Firebird21 | Firebird SQL
Jun 28, 2013 @ 23:32:33