Funciones almacenadas
Son rutinas almacenadas, con nombre, definidas por el usuario, que pueden recibir parámetros de entrada y deben devolver algún valor (de un tipo específico previamente definido). Posteriormente, pueden ser usadas invocándolas en una expresión, como cualquier otra función predefinida de MySQL.
Una función siempre está asociada a una base de datos o esquema. Si no especificamos uno al momento de crearla se utilizará la base de datos por defecto. Para indicar una base de datos, debemos especificarla junto al nombre de la función al momento de crearla: nombre_bd.nombre_func
.
Creación
Para crear una nueva función, debemos utilizar la sentencia CREATE FUNCTION
, cuya sintaxis simplificada es la siguiente:
1CREATE FUNCTION [IF NOT EXISTS] <nombre>([<parametros>])2RETURNS <tipo> [<caracteristica>]3<cuerpo de la funcion>4RETURN <valor>;
Los parámetros de entrada son opcionales, pero los paréntesis siempre deben estar presentes.
Para definir el tipo de dato que la función va a devolver, debemos usar la cláusula RETURNS <tipo>
en la definición de la función.
Además, MySQL permite definir distintas características opcionales. <caracteristica>
puede contener distintas indicaciones para la creación, entre ellas, las opciones: DETERMINISTIC
, que quiere decir que para los mismos valores de entrada y para el mismo estado en la base de datos, se obtiene el mismo valor de salida, o NOT DETERMINISTIC
, para cualquier otro caso. Para este último caso, veremos que el valor de retorno puede variar, incluso para los mismos valores de entrada, ya que se tiene en cuenta factores externos, como los datos de la tabla, la fecha, etc.
Estas indicaciones sirven para que MySQL implemente optimizaciones al ejecutar la función (por ejemplo, almacenar el resultado en caché). Al ser opcionales, su uso queda bajo la responsabilidad y honestidad del usuario. El valor por defecto, si no indicamos ninguno, es: NOT DETERMINISTIC
.
Luego, en el cuerpo de la función debemos incluir al menos una vez la sentencia RETURN <valor>;
.
La cláusula opcional IF NOT EXISTS
sirve para que no se lance un error al crear una función, si ya existe una con el mismo nombre.
Por otro lado, las funciones no pueden contener sentencias que devuelvan result-sets, como, por ejemplo, la sentencia SELECT
(sin la cláusula INTO lista_variables
). Es decir, sólo pueden devolver un valor escalar.
Para utilizar una función simplemente debemos invocarla como a cualquier otra función de MySQL (COUNT()
, AVG()
, etc.).
Veamos un ejemplo de una función simple:
1CREATE FUNCTION suma_2(a int, b int)2RETURNS INT DETERMINISTIC3RETURN a + b;
Esta función puede ser usada de la siguiente manera:
1SELECT suma_2(5, 9) AS suma;
Lo cual devolverá el result-set:
suma |
---|
14 |
En este caso, la función solo contiene una sentencia, pero si necesitamos escribir más, debemos utilizar la sintaxis para sentencias compuestas BEGIN ... END
.