En los lenguajes de programación existe un tipo de rutina al cual se le llama FUNCIÓN.

La característica de una FUNCIÓN es que puede recibir cero, uno, o varios parámetros de entrada y siempre devuelve exactamente un parámetro de salida.

Ese parámetro de salida devuelto por una FUNCIÓN puede ser asignado a una variable, utilizado en una fórmula, o comparado con otros valores.

Firebird actualmente no dispone de funciones, sí tiene stored procedures pero no tiene funciones. Éstas recién estarán disponibles cuando se libere la versión 3.0

Pero mientras tanto aunque no tenga funciones nosotros podemos simular que sí las tiene. Para ello utilizaremos un truco. La sintaxis para usar a un stored procedure como si fuera una función es la siguiente:

SELECT
   T.MiColumna1,
   F.MiValor
FROM
   MiTabla T
LEFT JOIN
   MiStoredProcedureSeleccionable(T.MiColumna1) F
      ON 1 = 1

Entendiendo al truco:

  1. El stored procedure debe ser seleccionable. O sea que debe tener el comando SUSPEND en él.
  2. Es preferible usar LEFT JOIN para que aún en el caso de que el stored procedure devuelva NULL se puedan obtener las columnas de la tabla principal
  3. La condición del LEFT JOIN debe ser siempre verdadera. Al poner 1 = 1 nos aseguramos que así sea, porque evidentemente 1 siempre será igual a 1.

Usando el valor devuelto por la función

El valor que nos devolvió nuestra función (en realidad nuestro stored procedure seleccionable, como ya sabes) a todos los efectos puede ser tratado como si fuera una columna más. O sea que lo podemos usar en una fórmula, con la cláusula WHERE, con la cláusula ORDER BY, etc.

Ejemplo 1:

SELECT
   T.MiColumna1,
   F.MiValor,
   T.MiColumna2 * F.MiValor
FROM
   MiTabla T
LEFT JOIN
   MiStoredProcedureSeleccionable(T.MiColumna1) F
      ON 1 = 1

En este ejemplo multiplicamos a F.MiValor (que es el valor que devolvió la función) por T.MiColumna2. O sea que usamos a F.MiValor en una fórmula

Ejemplo 2:

SELECT
   T.MiColumna1,
   F.MiValor
FROM
   MiTabla T
LEFT JOIN
   MiStoredProcedureSeleccionable(T.MiColumna1) F
      ON 1 = 1
WHERE
   F.MiValor = 125

En este caso usamos a F.MiValor en una condición de la cláusula WHERE

Ejemplo 3:

SELECT
   T.MiColumna1,
   F.MiValor
FROM
   MiTabla T
LEFT JOIN
   MiStoredProcedureSeleccionable(T.MiColumna1) F
      ON 1 = 1
ORDER BY
   F.MiValor

Ahora, ordenamos el conjunto resultado según el valor que tenga F.MiValor

Conclusión:

Aunque actualmente Firebird no dispone de funciones (las dispondrá cuando salga la versión 3.0) eso no es problema para nosotros porque podemos simularlas muy fácilmente. Para ello lo único que debemos hacer es crear un stored procedure seleccionable, hacer un LEFT JOIN a ese stored procedure seleccionable y asegurarnos que la condición siempre sea verdadera (al poner 1 = 1 nos aseguramos de que así sea).

Y además, este truco tiene una ventaja adicional: no es precioso que el stored procedure devuelva solamente un parámetro de salida, puede devolver varios, y los podemos usar a todos ellos si queremos. O sea que si MiStoredProcedureSeleccionable devuelve los parámetros de salida MiValor1, MiValor2, MiValor3, en nuestro SELECT podremos usar a MiValor1, MiValor2, y MiValor3, si así lo deseamos. ¡¡¡Excelente!!!

Artículos relacionados:

El índice del blog Firebird21

El foro del blog Firebird21

 

Anuncios