En general, quienes recién empiezan a usar Firebird entienden bastante bien el  concepto de stored procedure, después de todo es lo mismo que una rutina, procedimiento o función en el lenguaje de programación que están acostumbrados a usar (Visual FoxPro, Visual Basic, Delphi, C, C++, Java, etc.).

Sin embargo, suelen tener dificultades en entender a los triggers, así que aquí explicaremos en que se asemejan y en que se diferencian.

Semejanzas:

  1. Ambos son código fuente que escribimos dentro de la Base de Datos
  2. En ambos podemos usar excepciones
  3. En ambos podemos usar las operaciones: INSERT, UPDATE, DELETE, SELECT
  4. En ambos podemos usar EXECUTE PROCEDURE
  5. En ambos se pueden escribir comentarios

Diferencias:

  1. A los stored procedures se los debe llamar explícitamente con el comando EXECUTE PROCEDURE o con el comando SELECT. Los triggers son invocados automáticamente por el Firebird
  2. Los triggers disponen de dos seudo-variables llamadas NEW y OLD. Con NEW sabemos cual es el valor que se guardará en una columna, con OLD conocemos cual es el valor que actualmente está guardado en esa columna
  3. En los triggers tenemos tres variables de tipo boolean, llamadas: INSERTING, UPDATING, DELETING, las cuales nos permiten saber si el trigger fue lanzado durante una operación de inserción, de actualización o de borrado
  4. Los stored procedures pueden no recibir parámetros de entrada, recibir un solo parámetro de entrada, recibir muchos parámetros de entada. Los triggers no reciben parámetros de entrada
  5. Los stored procedures pueden no devolver valores, devolver un solo valor, devolver muchos valores. Los triggers nunca devuelven valores
  6. Para determinar en que orden se ejecutarán los triggers se usa la variable POSITION que puede valer 0, 1, 2, 3, 4, …, etc. Primero se ejecuta el trigger que tiene POSITION = 0, luego el que tiene POSITION = 1, y así sucesivamente

Ejemplo de stored procedure:

Listado 1.

CREATE PROCEDURE EXISTE_NUMERO_NOTA_CREDITO(
   tcCodSuc TYPE OF COLUMN MOVIMCAB.MVC_CODSUC,
   tcNotCre TYPE OF COLUMN MOVIMCAB.MVC_NOTNRO)
RETURNS(
   ftlDocumentoExiste TYPE OF D_BOOLEAN)
AS
   DECLARE VARIABLE lcNumero TYPE OF COLUMN MOVIMCAB.MVC_NOTNRO;
BEGIN

   SELECT
      COALESCE(M.MVC_NOTNRO, '')
   FROM
      MOVIMCAB M
   WHERE
      M.MVC_CODSUC = :tcCodSuc AND
      M.MVC_TIPMOV = 'NCR' AND
      M.MVC_NOTNRO = :tcNotCre
   INTO
     :lcNumero;

   ftlDocumentoExiste = 'F';

   IF (tcNotCre = lcNumero) THEN
      ftlDocumentoExiste = 'T';

END

En este stored procedure tenemos:

  • Dos parámetros de entrada (tcCodSuc y tcNotCre)
  • Un parámetro de salida (ftlDocumentoExiste)
  • Una variable interna del stored procedure (lcNumero)

Ejemplo de trigger:

Listado 2.

CREATE TRIGGER DEPARTAMENTOS_BI FOR DEPARTAMENTOS
   ACTIVE BEFORE INSERT OR UPDATE
   POSITION 1
AS
BEGIN

   IF (NEW.DEP_IDENTI IS NULL OR NEW.DEP_IDENTI <= 0) THEN
      EXCEPTION E_SIN_IDENTIFICADOR;

   IF (NEW.DEP_CODIGO IS NULL OR CHAR_LENGTH(TRIM(NEW.DEP_CODIGO)) = 0) THEN
      EXCEPTION E_SIN_CODIGO;

   IF (NEW.DEP_NOMBRE IS NULL OR CHAR_LENGTH(TRIM(NEW.DEP_NOMBRE)) = 0) THEN
      EXCEPTION E_SIN_NOMBRE;

END

Este trigger valida las columnas que se quieren insertar o actualizar en la tabla de DEPARTAMENTOS, impidiendo que ocurra la inserción o actualización cuando la columna DEP_IDENTI es nula o es cero, la columna DEP_CODIGO es nula o está vacía, la columna DEP_NOMBRE es nula o está vacía.

Como el trigger es BEFORE INSERT OR UPDATE será lanzado automáticamente cada vez que se quiera insertar o actualizar alguna fila de la tabla de DEPARTAMENTOS.

O sea que si escribimos:

INSERT INTO DEPARTAMENTOS VALUES(0, 1, ‘PRUEBA’);

el Firebird lanzará el trigger. También lo lanzará si escribimos algo como:

UPDATE DEPARTAMENTOS SET DEP_NOMBRE = ‘Otra prueba’ WHERE DEP_IDENTI = 123;

Artículos relacionados:

Entendiendo a los stored procedures

Entendiendo a los triggers

Entendiendo a las excepciones

El índice del blog Firebird21

El foro del blog Firebird21