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