Teniendo FOR SELECT anidados

Deja un comentario

En ocasiones necesitamos tener FOR SELECT anidados. ¿Es eso posible en Firebird?

Sí, ningún problema.

Aquí vemos un ejemplo, este stored procedure no hace algo útil, sirve solamente para mostrar que se pueden anidar los FOR SELECT si los necesitamos anidados.

CREATE PROCEDURE FOR_ANIDADOS
   RETURNS(
      ftnIdenti TYPE OF COLUMN MOVIMCAB.MVC_IDENTI,
      ftnCantid TYPE OF COLUMN MOVIMDET.MOV_CANTID)
AS
   DECLARE VARIABLE lnIdeCab TYPE OF COLUMN MOVIMCAB.MVC_IDENTI;
   DECLARE VARIABLE ldFechax TYPE OF COLUMN MOVIMCAB.MVC_FECHAX;
   DECLARE VARIABLE lcNroDoc TYPE OF COLUMN MOVIMCAB.MVC_NRODOC;
   DECLARE VARIABLE lnIdePrd TYPE OF COLUMN MOVIMDET.MOV_IDENTI;
   DECLARE VARIABLE lnCantid TYPE OF COLUMN MOVIMDET.MOV_CANTID;
BEGIN

   FOR SELECT
      MVC_IDENTI,
      MVC_FECHAX,
      MVC_NRODOC
   FROM
      MOVIMCAB
   INTO
      :lnIdeCab,
      :ldFechax,
      :lcNroDoc
   DO BEGIN
      FOR SELECT
         MOV_IDEPRD,
         MOV_CANTID
      FROM
         MOVIMDET
      WHERE
         MOV_IDECAB = :lnIdeCab
      INTO
         :lnIdePrd,
         :lnCantid
      DO BEGIN
         ftnIdenti = :lnIdeCab;
         ftnCantid = :lnCantid;
         SUSPEND;
      END
   END

END;

Como puedes ver, ningún secreto, aunque por supuesto debes verificar que se cumplan las condiciones del WHERE para que el FOR SELECT arroje algunos resultados. También recuerda que debes incluir el comando SUSPEND en el lugar donde quieres que el stored procedure te devuelva valores. Los valores que devolverá serán los que tienen los parámetros de salida (es decir, los que se encuentran después del RETURNS) en el momento de ejecutarse el SUSPEND.

El autor de este blog utiliza la notación camello y siempre los parámetros de salida empiezan con la letra “f”, significando “Firebird”.

De esa manera es muy fácil saber si una variable es una variable local (porque empieza con “l”), un parámetro de entrada (porque empieza con “t”) o un parámetro de salida (porque empieza con “f”).

 Artículo relacionado:

La notación camello

El índice del blog Firebird 21

 

La notación camello

3 comentarios

Cuando escribimos nuestros stored procedures generalmente necesitamos usar algunas variables: parámetros de entrada, parámetros de salida, variables locales. Estas últimas también las solemos usar en los triggers.

¿Cómo las nombramos, cómo distinguimos si en una variable se guardarán caracteres, números, fechas, etc.?

Si eso no nos preocupa en lo absoluto, entonces podríamos tener algo como esto:

NOMBRE = ‘Este es un nombre’;

NUMERO = 5487;

VAR1 = 456;

VAR2 = ‘Salario mensual’;

pero usar esa notación cuando el stored procedure o el trigger es largo y tenemos muchas variables se presta a malinterpretaciones y la lectura de nuestro código fuente puede demorar más de lo previsto. Y ni que decir si no lo leemos nosotros sino otra persona, se le dificultará entender lo que escribimos.

Para facilitar la lectura del código fuente existe algo que se llama notación camello y que como verás es empleada en este blog.

En la notación camello (llamada así porque parecen las jorobas de un camello) los nombres de cada palabra empiezan con mayúscula y el resto se escribe con minúsculas. No se usan puntos ni guiones para separar las palabras. Además, para saber el tipo de variable se utiliza un prefijo. En este blog los prefijos usados son:

f = Firebird

t = parámetro de entrada o de salida

l = variable local

c = caracter

n = número

d = fecha

h = hora

Ejemplos:

tcNumeroCuenta (parámetro de entrada o de salida, de tipo caracter)

tnSaldoActual (parámetro de entrada o de salida, de tipo numérico)

lnCantidad (variable local, de tipo numérico)

lcEsCuentaAsentable (variable local, de tipo caracter)

tdFechaInicial (parámetro de entrada o salida, de tipo fecha)

ftnCantidadProductosEnOferta (parámetro de salida, de tipo numérico, que se devolverá al lenguaje de programación)

ftcNumeroUltimaFactura (parámetro de salida, de tipo carácter, que se devolverá al lenguaje de programación)

¿Por qué algunos parámetros de salida tienen el prefijo “f”?

Un stored procedure puede ser llamado desde otro stored procedure o desde un lenguaje de programación (Visual FoxPro, Visual Basic, Delphi, C, C++, Java, etc.). Cuando se llama desde un lenguaje de programación donde también se usa la notación camello puede ocurrir un conflicto porque en ese lenguaje de programación se podría estar usando una variable idéntica. Por ejemplo, si en tu programa tienes una variable llamada tnSaldoActual y tu stored procedure devuelve un parámetro llamado tnSaldoActual habrá un conflicto y podrías encontrarte con un problema por esa causa. Para evitar que tal cosa ocurra, los parámetros de salida que pueden ser usados desde un lenguaje de programación son prefijados con la letra “f”, que significa Firebird. Y entonces, no hay confusión posible.

Conclusión:

Usar una notación consistente y siempre la misma notación redunda en un gran beneficio cuando queremos leer el código fuente escrito en los stored procedures y en los triggers. La notación camello es muy clara y muy entendible, por eso fue elegida por el autor de este blog. En esta notación la inicial de cada palabra se escribe en mayúsculas y las demás letras en minúsculas. No se usan guiones para separar a las palabras. Para indicar el tipo de variable se usan prefijos predeterminados los cuales siempre se escriben en minúsculas.

Artículo relacionado:

El índice del blog Firebird21