Sentencia IF
La sentencia IF permite ejecutar diferentes bloques de código según una condición. Es la estructura de control de flujo más básica dentro de un procedimiento almacenado.
Sintaxis
-- IF simple
IF condicion THEN
sentencias;
END IF;
-- IF...ELSE
IF condicion THEN
sentencias;
ELSE
sentencias;
END IF;
-- IF...ELSEIF...ELSE
IF condicion1 THEN
sentencias;
ELSEIF condicion2 THEN
sentencias;
ELSEIF condicion3 THEN
sentencias;
ELSE
sentencias;
END IF;IF simple
DELIMITER //
CREATE PROCEDURE verificar_stock(IN prod_id INT)
BEGIN
DECLARE v_stock INT;
DECLARE v_nombre VARCHAR(100);
SELECT nombre, stock INTO v_nombre, v_stock
FROM productos WHERE id = prod_id;
IF v_stock = 0 THEN
SELECT v_nombre AS producto, 'SIN STOCK' AS estado;
END IF;
IF v_stock > 0 THEN
SELECT v_nombre AS producto, 'Disponible' AS estado, v_stock AS unidades;
END IF;
END //
DELIMITER ;CALL verificar_stock(1);| producto | estado | unidades |
|---|---|---|
| iPhone 15 Pro | Disponible | 45 |
IF...ELSE
DELIMITER //
CREATE PROCEDURE clasificar_precio(IN prod_id INT)
BEGIN
DECLARE v_nombre VARCHAR(100);
DECLARE v_precio DECIMAL(10,2);
SELECT nombre, precio INTO v_nombre, v_precio
FROM productos WHERE id = prod_id;
IF v_precio > 500 THEN
SELECT v_nombre AS producto, v_precio AS precio, 'Premium' AS categoria;
ELSE
SELECT v_nombre AS producto, v_precio AS precio, 'Estándar' AS categoria;
END IF;
END //
DELIMITER ;CALL clasificar_precio(1);| producto | precio | categoria |
|---|---|---|
| iPhone 15 Pro | 1299.99 | Premium |
CALL clasificar_precio(22);| producto | precio | categoria |
|---|---|---|
| Camiseta algodón básica | 19.99 | Estándar |
IF...ELSEIF...ELSE
DELIMITER //
CREATE PROCEDURE nivel_stock(IN prod_id INT)
BEGIN
DECLARE v_nombre VARCHAR(100);
DECLARE v_stock INT;
DECLARE v_nivel VARCHAR(20);
SELECT nombre, stock INTO v_nombre, v_stock
FROM productos WHERE id = prod_id;
IF v_stock = 0 THEN
SET v_nivel = 'Agotado';
ELSEIF v_stock < 20 THEN
SET v_nivel = 'Bajo';
ELSEIF v_stock < 50 THEN
SET v_nivel = 'Normal';
ELSEIF v_stock < 100 THEN
SET v_nivel = 'Alto';
ELSE
SET v_nivel = 'Sobrestock';
END IF;
SELECT v_nombre AS producto, v_stock AS stock, v_nivel AS nivel;
END //
DELIMITER ;CALL nivel_stock(7);| producto | stock | nivel |
|---|---|---|
| ASUS ROG Zephyrus | 12 | Bajo |
CALL nivel_stock(4);| producto | stock | nivel |
|---|---|---|
| Xiaomi 14 | 80 | Alto |
IF anidados
DELIMITER //
CREATE PROCEDURE evaluar_producto(IN prod_id INT)
BEGIN
DECLARE v_nombre VARCHAR(100);
DECLARE v_precio DECIMAL(10,2);
DECLARE v_stock INT;
DECLARE v_mensaje VARCHAR(200);
SELECT nombre, precio, stock INTO v_nombre, v_precio, v_stock
FROM productos WHERE id = prod_id;
IF v_stock > 0 THEN
IF v_precio > 1000 THEN
SET v_mensaje = 'Producto premium disponible';
ELSE
SET v_mensaje = 'Producto disponible';
END IF;
ELSE
IF v_precio > 1000 THEN
SET v_mensaje = 'Producto premium AGOTADO - Reponer urgente';
ELSE
SET v_mensaje = 'Producto agotado';
END IF;
END IF;
SELECT v_nombre AS producto, v_precio AS precio, v_stock AS stock, v_mensaje AS mensaje;
END //
DELIMITER ;Ejemplo práctico: validar pedido
DELIMITER //
CREATE PROCEDURE validar_pedido(
IN p_cliente_id INT,
IN p_producto_id INT,
IN p_cantidad INT,
OUT p_valido BOOLEAN,
OUT p_mensaje VARCHAR(200)
)
BEGIN
DECLARE v_cliente_existe INT;
DECLARE v_stock INT;
DECLARE v_activo BOOLEAN;
SET p_valido = FALSE;
-- Verificar cliente
SELECT COUNT(*) INTO v_cliente_existe
FROM clientes WHERE id = p_cliente_id;
IF v_cliente_existe = 0 THEN
SET p_mensaje = 'Cliente no encontrado';
ELSE
-- Verificar producto
SELECT stock, activo INTO v_stock, v_activo
FROM productos WHERE id = p_producto_id;
IF v_activo = FALSE THEN
SET p_mensaje = 'Producto no activo';
ELSEIF v_stock = 0 THEN
SET p_mensaje = 'Producto sin stock';
ELSEIF v_stock < p_cantidad THEN
SET p_mensaje = CONCAT('Stock insuficiente. Disponible: ', v_stock);
ELSE
SET p_valido = TRUE;
SET p_mensaje = 'Pedido válido';
END IF;
END IF;
END //
DELIMITER ;CALL validar_pedido(1, 1, 2, @valido, @msg);
SELECT @valido AS valido, @msg AS mensaje;| valido | mensaje |
|---|---|
| 1 | Pedido válido |
Limpieza
DROP PROCEDURE IF EXISTS verificar_stock;
DROP PROCEDURE IF EXISTS clasificar_precio;
DROP PROCEDURE IF EXISTS nivel_stock;
DROP PROCEDURE IF EXISTS evaluar_producto;
DROP PROCEDURE IF EXISTS validar_pedido;En el siguiente artículo veremos la sentencia CASE, una alternativa más limpia al IF para múltiples condiciones.
Escrito por Eduardo Lázaro
