MySQL permite la programación de procedimientos almacenados y funciones para ejecutar operaciones en la base de datos de manera estructurada y reutilizable.
🔹 Procedimientos almacenados (Stored Procedures
): Son bloques de código que ejecutan múltiples sentencias SQL y pueden recibir parámetros de entrada y salida.
🔹 Funciones (Stored Functions
): Devuelven un valor único y se pueden usar en consultas SQL.
✅ Reutilización: Se pueden invocar múltiples veces sin escribir el mismo código.
✅ Seguridad: Se pueden restringir los permisos de acceso a los datos.
✅ Rendimiento: Reducen la carga de la red al ejecutarse directamente en el servidor de la base de datos.
✅ Modularidad: Facilitan la organización y mantenimiento del código SQL.
Un procedimiento almacenado es un conjunto de instrucciones SQL que se pueden ejecutar llamándolo con CALL nombre_procedimiento();
.
DELIMITER $$
CREATE PROCEDURE ObtenerClientes()
BEGIN
SELECT * FROM clientes;
END $$
DELIMITER ;
🔹 Explicación:
DELIMITER $$
cambia el delimitador para evitar que ;
termine la creación del procedimiento.BEGIN ... END
agrupa las instrucciones del procedimiento.CALL ObtenerClientes();
se usa para ejecutarlo.📌 Llamar al procedimiento:
CALL ObtenerClientes();
Los procedimientos almacenados pueden aceptar parámetros de entrada (IN
), salida (OUT
) o ambos (INOUT
).
DELIMITER $$
CREATE PROCEDURE ObtenerClientePorID(IN id_cliente INT)
BEGIN
SELECT * FROM clientes WHERE id_cliente = id_cliente;
END $$
DELIMITER ;
📌 Llamada con un parámetro:
CALL ObtenerClientePorID(2);
DELIMITER $$
CREATE PROCEDURE ContarClientes(OUT total_clientes INT)
BEGIN
SELECT COUNT(*) INTO total_clientes FROM clientes;
END $$
DELIMITER ;
📌 Llamada con variable de salida en MySQL:
CALL ContarClientes(@total);
SELECT @total; -- Ver resultado
A diferencia de los procedimientos, una función devuelve un solo valor y se puede usar en consultas SQL.
DELIMITER $$
CREATE FUNCTION ObtenerTotalPedidos(id_cliente INT) RETURNS INT
DETERMINISTIC
BEGIN
DECLARE total INT;
SELECT COUNT(*) INTO total FROM pedidos WHERE pedidos.id_cliente = id_cliente;
RETURN total;
END $$
DELIMITER ;
🔹 Explicación:
RETURNS INT
define el tipo de dato de retorno.DETERMINISTIC
indica que la función siempre devuelve el mismo resultado para los mismos valores de entrada.RETURN total
devuelve el resultado.📌 Uso de la función en una consulta:
SELECT ObtenerTotalPedidos(2) AS total_pedidos;
Característica | Procedimiento Almacenado | Función Almacenada |
---|---|---|
Devuelve un valor | ❌ No necesariamente | ✅ Sí, con RETURN |
Se usa en consultas SQL | ❌ No | ✅ Sí, en SELECT |
Modifica datos (INSERT , UPDATE , DELETE ) |
✅ Sí | ❌ No recomendado |
Parámetros de salida | ✅ Sí (OUT , INOUT ) |
❌ No |
Puedes usar DECLARE HANDLER
para capturar errores en procedimientos.
DELIMITER $$
CREATE PROCEDURE TransferenciaBancaria(
IN cuenta_origen INT,
IN cuenta_destino INT,
IN monto DECIMAL(10,2)
)
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Error en la transacción';
END;
START TRANSACTION;
UPDATE cuentas SET saldo = saldo - monto WHERE id_cuenta = cuenta_origen;
UPDATE cuentas SET saldo = saldo + monto WHERE id_cuenta = cuenta_destino;
COMMIT;
END $$
DELIMITER ;
🔹 Si algo falla en la transferencia, la transacción se revierte y devuelve un error.
✅ Usa procedimientos almacenados para tareas complejas como validaciones y transacciones.
✅ Usa funciones almacenadas cuando necesites calcular y devolver un solo valor.
✅ Siempre maneja errores en procedimientos para evitar datos inconsistentes.
✅ Evita escribir procedimientos demasiado largos; usa modularización.
✅ Verifica que el usuario tenga permisos para ejecutar procedimientos y funciones.
🚀 ¿Necesitas ayuda con un caso específico?
«Follow GPT creator profile on LinkedIn https://linkedin.com/in/khanukov/»