Blog de Gonzalo

PROCEDIMIENTOS Y FUNCIONES ALMACENADOS

En MySQL es posible crear procedimientos y funciones como en cualquier lenguaje de programación.
No es difícil, solo hay que conocer la sintaxis y ya se pueden crear.
A continuación pongo un ejemplo de como insertar un registro en una tabla, mediante un procedimiento almacenado, y se le pasan los valores por defecto. Este ejemplo sencillo sirve para ver como se crean los procedimientos almacenados pero en teoría es para crear códigos más complejos y su mayor ventaja es que al estar almacenado en la base de datos se ejecuta en un servidor separado y no interfiere en la ejecución de la aplicación. Otra ventaja es que pueden ser llamados desde diferente aplicaciones indistintamente.


DELIMITER $$
CREATE PROCEDURE crearContacto (IN email VARCHAR(100),IN address VARCHAR(100),IN firstname VARCHAR(20),IN lastname VARCHAR(20),IN phone VARCHAR(16))
BEGIN
INSERT INTO
contact(firstname,lastname,address,email,phonenumber)
VALUES
(firstname,lastname,address,email,phone);
END$$
DELIMITER ;


En este ejemplo hay un IF para ver como funciona


DELIMITER $$
CREATE PROCEDURE coches(IN velocidad INT,IN marca VARCHAR(50))
BEGIN
IF velocidad < 120 THEN
INSERT INTO familiares VALUES(velocidad,marca);
ELSE
INSERT INTO deportivos VALUES(velocidad,marca);
END IF;
END$$
DELIMITER ;


La palabra DELIMITER $$ le indica a MYSQL que substituya al punto y coma (;) como separador de código y en su lugar utilice el doble signo de dolar( $$ )que es lo que hay que indicarle a phpMyAdmin pero en MYSQL se puede usar la doble barra (//) u otros caracteres; el por qué hemos sustituido el punto y coma por una doble dolar se debe a que dentro de los procedimientos almacenados las instrucciones se separan precisamente con punto y coma, lo que ocasionaría, de no cambiar el delimitador, que el motor de base de datos se confunda y envíe error al tratar de crear un procedimiento almacenado al no saber donde comienza y dónde termina éste. Cómo se puede observar luego se pone DELIMITER ;.
Para llamar a dicho procedimiento se usa la función CALL:

CALL crearContacto('probando@gonzalo.es','gaztambide','gonzalo','lopez','123456789')

Las funciones almacenadas se crean igual que los procedimientos almacenados pero cambian un par de cosas que vamos a ver con el mismo ejemplo de crear un contacto, como el de antes.

DELIMITER $$
CREATE FUNCTION crearContact (email VARCHAR(100),address VARCHAR(100), firstname VARCHAR(20), lastname VARCHAR(20), phone VARCHAR(16)) RETURNS INT
BEGIN
INSERT INTO
contact(firstname,lastname,address,email,phonenumber)
VALUES
(firstname,lastname,address,email,phone);
RETURN last_insert_id();
END$$
DELIMITER ;


Han cambiado varias cosas entre ellas la palabra PROCEDURE por FUNCTION (que resulta algo obvio).
El siguiente cambio es que en el paso de parámetros ya no se escribe la palabra reservada IN sino que se pone el parámtero tal cual. Luego se indica el tipo de valor que se va a devolver. El resto de sintaxis es igual.

LLAMAR A UN PROCEDIMIENTO Y A UNA FUNCIÓN


En esto hay también diferencias y la verdad es que no tiene nada que ver ninguna con la otra. Os pongo un ejemplo para que lo veáis.
Llamada a UN PROCEDIMIENTO

CALL procedure_name(list of params);

Llamada a UNA FUNCIÓN

Select function_name(list of params);

DIFERENCIA ENTRE UN PROCEDIMIENTO Y UNA FUNCIÓN


La mayor diferencia es que UN PROCEDIMIENTO no devuelve ningún valor y UNA FUNCIÓN hay otras diferencias conceptuales, pero para que todo el mundo entienda la diferencia solo pongo ésta. Pero podéis buscar en internet, para profundizar más en el tema.
También podeís ver como crear cursores en mysql

Compartir en twitter