Como hemos comentado en el post de procedimientos almacenados, tener nuestras funciones y procedimientos en MySQL en lugar de de procesar los datos con algún lenguaje del lado del servidor, como PHP , tiene la ventaja de que viaja menos información de la base de datos al servidor web , con el consiguiente aumento del rendimiento y que estas funciones harán que podamos atacar la base de datos desde cualquier otro lenguaje, como Java o ASP.NET sin tener que volver a procesar los datos otra vez.
MySQL tiene muchas funciones que podemos usar en nuestro procedimientos almacenados y consultas, pero en ocasiones podemos necesitar crear nuestras propias funciones para hacer cosas más especializadas…
Vamos a ver cómo crear funciones en MySQL:
DELIMITER //
CREATE FUCNTION holaMundo() RETURNS VARCHAR(20)
BEGIN
RETURN ‘HolaMundo’;
END
//
Para comprobar que funciona tecleamos lo siguiente en la consola de MySQL :
Select holaMundo();
Lo que devuelve el siguiente resultado :
mysql> select holaMundo()//
+--------------+
| holaMundo() |
+--------------+
| Hola Mundo!! |
+--------------+
1 row in set (0.00 sec)
Para borrar la función que acabamos de crear :
DROP FUNCTION IF EXISTS holaMundo
Uso de las variables en funciones:
Las variables en las funciones se usan de igual manera que en los procedimientos almacenados, se declaran con la sentencia DECLARE, y se asignan valores con la sentencia SET.
DELIMITER //
CREATE FUNCTION holaMundo() RETURNS VARCHAR(30)
BEGIN
DECLARE salida VARCHAR(30) DEFAULT 'Hola mundo';
;
SET salida = ‘Hola mundo con variables’;
RETURN salida;
END
//
Esta variable es de ámbito local, y será destruida una vez finalice la función. Cabe destacar el uso de la sentencia DEFAULT en conjunto con DECLARE, que asigna un valor por defecto al declarar la variable.
Uso de parámetros en funciones:
DROP FUNCTION IF EXISTS holaMundo
CREATE FUNCTION holaMundo(entrada VARCHAR(20)) RETURNS VARCHAR(20)
BEGIN
DECLARE salida VARCHAR(20);
SET salida = entrada;
RETURN salida;
END
Ahora hemos creado una función que devuelve el mismo valor que le pasamos como parámetro.
Si tecleamos :
mysql> select holaMundo("nosolocodigo")//
+---------------------------+
| holaMundo("nosolocodigo") |
+---------------------------+
| nosolocodigo |
+---------------------------+
1 row in set (0.00 sec)
Obtenemos como resultado lo mismo que le hemos pasado como párametro, en este caso «nosolocodigo»
Para finalizar, algo un poco más complejo, vamos a crear una función que acepte un dividendo y un divisor y haga una división sin usar el operador división:
create function divide(dividendo int,divisor int) returns int
begin
declare aux int;
declare contador int;
declare resto int;
set contador = 0;
set aux = 0;
while (aux + divisor) <= dividendo do
set aux = aux + divisor ;
set contador = contador + 1;
end while;
set resto = dividendo - aux ;
return contador;
end;
//
Para usarlo, simplemente llamaríamos a la función así:
SELECT divide(20,2)
Lo que devolvería 10.
Mirar el post sobre el control de flujo con procedimientos almacenados si no entiendes esta última función.