Cuando escribimos un stored procedure o un trigger podemos usar sentencias simples o sentencias compuestas.

Si la sentencia es simple una sola línea es ejecutada, si la sentencia es compuesta muchas líneas pueden ser ejecutadas.

Ejemplo 1. Una sentencia simple en un IF()

IF (MiCondición) THEN
   MiSentencia;

-- Esta línea ya no está dentro del IF()
-- Y esta línea tampoco está dentro del IF()

En este caso solamente se ejecutará la línea MiSentencia si MiCondición es verdadera. Las que están a continuación se ejecutarán siempre ¿por qué? porque no están incluidas en el IF().

Ejemplo 2. Una sentencia compuesta en un IF()

IF (MiCondición) THEN BEGIN
   MiSentencia1;
   MiSentencia2;
   MiSentencia3;
   --
   MiSentencian;
END
-- Esta línea ya no está dentro del IF()
-- Y esta línea tampoco está dentro del IF()

En este caso la sentencia ya no es simple sino compuesta ¿y cómo sabemos eso? Porque el Firebird trata a todas las sentencias escritas entre el BEGIN y el END como pertenecientes al IF(), hay varias sentencias allí y todas ellas serán ejecutadas si MiCondición es verdadera.

Ejemplo 3. Una sentencia compuesta y una sentencia simple en un IF()

IF (MiCondición) THEN BEGIN
   MiSentencia1;
   MiSentencia2;
   MiSentencia3;
   --
   MiSentencian;
END ELSE
   MiSentenciax;
-- Esta línea ya no está dentro del ELSE
-- Y esta línea tampoco está dentro del ELSE

En este caso, si MiCondición es verdadera se ejecutará la sentencia compuesta que está entre el BEGIN y el END pero si MiCondición es falsa entonces se ejecutará la sentencia simple que está a continuación del ELSE.

Ejemplo 4. Dos sentencias compuestas en un IF()

IF (MiCondición) THEN BEGIN
   MiSentencia1;
   MiSentencia2;
   MiSentencia3;
   --
   MiSentencian;
END ELSE BEGIN
   MiSentenciax;
   MiSentenciay;
   MiSentenciaz;
   --
   MiSentenciam;
END
-- Esta línea ya no está dentro del ELSE
-- Y esta línea tampoco está dentro del ELSE

En este caso hay un BEGIN … END después del THEN y hay otro BEGIN … END después del ELSE. ¿Qué significa eso? Que si MiCondición es verdadera se ejecutarán todas las líneas que están en el primer BEGIN … END y en cambio si MiCondición es falsa se ejecutarán todas las líneas que están en el segundo BEGIN … END.

Ejemplo 5. Una sentencia simple en un ciclo WHILE()

WHILE (MiCondición) DO
   MiSentencia;
-- Esta línea ya no está dentro del WHILE
-- Y esta línea tampoco está dentro del WHILE

Aquí, mientras MiCondición sea verdadera se ejecutará MiSentencia.

Ejemplo 6. Una sentencia compuesta en un ciclo WHILE()

WHILE (MiCondición) DO BEGIN
   MiSentencia1;
   MiSentencia2;
   MiSentencia3;
   --
   MiSentencian;
END
-- Esta línea ya no está dentro del WHILE
-- Y esta línea tampoco está dentro del WHILE

Ahora en el ciclo WHILE() se está usando una sentencia compuesta. Todas las líneas que hayamos escrito entre el BEGIN y el END se ejecutarán mientras MiCondición sea verdadera.

Ejemplo 7. Una sentencia simple en un FOR SELECT

FOR SELECT
   MiColumna
FROM
   MiTabla
INTO
   :MiVariable
DO
   MiSentencia;
-- Este línea ya no pertenece al FOR SELECT
-- Y esta línea tampoco

Solamente MiSentencia se ejecutará porque se trata de una sentencia simple y por lo tanto solamente la línea que sigue al DO se ejecuta.

Ejemplo 8. Una sentencia compuesta en un FOR SELECT

FOR SELECT
   MiColumna
FROM
   MiTabla
INTO
   :MiVariable
DO BEGIN
   MiSentencia1;
   MiSentencia2;
   MiSentencia3;
   --
   MiSentencian;
END
-- Este línea ya no pertenece al FOR SELECT
-- Y esta línea tampoco

Después del DO hay un BEGIN … END, eso nos indica que se trata de una sentencia compuesta y por lo tanto todas las líneas que se encuentran dentro del BEGIN … END serán ejecutadas.

Conclusión:

Al igual que en Pascal, C, y otros lenguajes en Firebird podemos usar sentencias simples o sentencias compuestas. Las sentencias compuestas empiezan con un BEGIN y finalizan con un END y todo lo que esté escrito entre esas dos palabras se trata como una unidad.

Si no usamos BEGIN … END entonces siempre y en todos los casos la sentencia será simple. Para que sea compuesta sí o sí deberemos rodearla por las palabras BEGIN … END

Artículos relacionados:

El índice del blog Firebird21

El foro del blog Firebird21