Introducción a los procedimientos almacenados

Un procedimiento almacenado es un conjunto de sentencias SQL que se guarda en el servidor de base de datos y se ejecuta con una sola llamada. Los procedimientos pueden recibir parámetros, usar variables, condicionales, bucles y devolver resultados.

¿Qué es un procedimiento almacenado?

Un procedimiento almacenado es como una función que vive dentro de MySQL. En lugar de enviar varias sentencias SQL desde tu aplicación, encapsulas la lógica en un procedimiento y lo llamas por su nombre:

-- Sin procedimiento: múltiples consultas desde la aplicación
SELECT * FROM productos WHERE categoria_id = 6;
SELECT AVG(precio) FROM productos WHERE categoria_id = 6;
SELECT COUNT(*) FROM productos WHERE categoria_id = 6;
 
-- Con procedimiento: una sola llamada
CALL resumen_categoria(6);

Primer ejemplo

DELIMITER //
 
CREATE PROCEDURE contar_productos()
BEGIN
    SELECT COUNT(*) AS total_productos FROM productos;
END //
 
DELIMITER ;
CALL contar_productos();
total_productos
30

Ventajas

VentajaDescripción
Reducción de tráfico de redSe envía solo CALL nombre() en lugar de múltiples sentencias
ReutilizaciónEl mismo procedimiento se puede llamar desde diferentes aplicaciones
SeguridadLos usuarios pueden ejecutar procedimientos sin acceso directo a las tablas
Mantenimiento centralizadoLa lógica de negocio se modifica en un solo lugar
RendimientoMySQL puede cachear el plan de ejecución

Desventajas

DesventajaDescripción
Depuración difícilMySQL no ofrece herramientas avanzadas de debugging
Portabilidad limitadaLa sintaxis varía entre motores de base de datos
Consumo de recursosLa lógica compleja consume memoria y CPU del servidor
Control de versionesEs más difícil versionar procedimientos que código de aplicación

Ver procedimientos existentes

-- Listar procedimientos de la base de datos actual
SHOW PROCEDURE STATUS WHERE Db = 'tienda_mysql';
-- Ver la definición de un procedimiento
SHOW CREATE PROCEDURE contar_productos\G

Limpieza

DROP PROCEDURE IF EXISTS contar_productos;

En el siguiente artículo veremos el comando DELIMITER, necesario para definir procedimientos almacenados en el cliente MySQL.

Escrito por Eduardo Lázaro