A diferencia de las funciones escalares, que devuelven un valor, este tipo de funciones retornan el contenido de una tabla, es decir, retornan un conjunto de tuplas.
A continuación se muestra un ejemplo de cómo implementar dicho tipo de funciones. Se tiene una tabla, correspondiente a una librería, llamada LIBRO. Dicha tabla tiene los siguientes datos:
A continuación se crea una función de tabla:
Se detalla, a continuación, la explicación de la anterior función.
- Se crea una función, llamada f_ofertas. Dicha función recibe un parámetro, llamado @mínimo, de tipo money.
- La función retorna una variable de tipo tabla, @ofertas. Por ser una variable de tipo tabla, tiene campos, los cuales se muestran entre paréntesis. Estos campos son código, título y precio.
- La lógica de la función, lo que está enmarcado dentro del BEGIN y END, inserta en la variable @ofertas las tuplas resultantes del SELECT que se muestra. Es decir, al final, la variable @ofertas tiene un conjunto de tuplas almacenadas.
- La palabra RETURN, al final de la lógica, retorna el contenido de la variable @ofertas.
Para invocar este tipo de funciones, no hay que especificar el propietario de la función:
Se invoca la función, enviándole como parámetro el valor de 50000, lo cual trae los datos de los libros cuyo precio es menor a este valor.
También se puede invocar la función, seleccionando ciertos campos de la variable tipo tabla, @ofertas:
Es importante mencionar que este tipo de funciones, por devolver una tabla, puede insertarse dentro de un JOIN, por ejemplo, de la siguiente manera:
Como comentario final, se debe mencionar la diferencia que hay entre este tipo de funcion y una vista. Mientras en una vista solo se puede usar el SELECT, en este tipo de funciones puede haber una lógica más elaborada, incluyendo IFs, WHILEs, etc.
Por otro lado, este tipo de función se podría implementar también con un procedimiento almacenado. La gran diferencia es que como el procedimiento almacenado no retorna valores, no se invoca, entonces no se puede insertar dentro del FROM de un SELECT.
Video: