Un procedimiento almacenado MySQL no es más que una porción de código que puedes guardar y reutilizar. Es útil cuando repites la misma tarea repetidas veces, siendo un buen método para encapsular el código. Al igual que ocurre con las funciones, también puede aceptar datos como parámetros, de modo que actúa en base a éstos.
Al reducir la carga en las capas superiores de al aplicación, se reduce el tráfico de red y, si el uso de los procedimientos almacenados es el correcto, puede mejorar el rendimiento.
Al encapsular las operaciones en el propio código SQL, nos aseguramos de que el acceso a los datos es consistente entre todas las aplicaciones que hagan uso de ellos.
En cuanto a seguridad, es posible limitar los permisos de acceso de usuario a los procedimientos almacenados y no a las tablas directamente. Des este modo evitamos problemas derivados de una aplicación mal programada que haga un mal uso de las tablas.
Al igual que ocurre con toda tecnología, tenemos que formarnos para aprender a crear procedimientos, por lo que existe cierta curva de aprendizaje.
Otro posible problema puede ocurrir con las migraciones. No todos los sistemas gestores de bases de datos usan los procedimientos del mismo modo, por lo que se reduce la portabilidad del código.
Al hacer cambios en las estructuras de datos habra que hacer modificaciones al codigo de los procedimientos.
Sintaxis
CREATE PROCEDURE nombre_procedimiento
AS
sentencias_sql
GO;
En los procedimientos almacenados podemos tener tres tipos de parámetros:
Crearemos un procedimiento que retornara el stock de un producto.
Sintaxis
DROP PROCEDURE IF EXISTS puntodeventa.calcularStock;
DELIMITER $$
$$
CREATE PROCEDURE puntodeventa.calcularStock(in id_producto int, out stock float)
begin
select sum(cantidad) into @altas
from puntodeventa.movimientos
where producto_id = id_producto and tipo = 1;
select sum(cantidad) into @bajas
from puntodeventa.movimientos
where producto_id = id_producto and tipo != 1;
set stock = @altas - @bajas;
END$$
DELIMITER ;
Sintaxis
set @stock=0;
CALL calcularStock(18, @stock);
select @stock as stock;
Sintaxis
DROP PROCEDURE calcularStock;