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);
productoestadounidades
iPhone 15 ProDisponible45

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);
productopreciocategoria
iPhone 15 Pro1299.99Premium
CALL clasificar_precio(22);
productopreciocategoria
Camiseta algodón básica19.99Está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);
productostocknivel
ASUS ROG Zephyrus12Bajo
CALL nivel_stock(4);
productostocknivel
Xiaomi 1480Alto

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;
validomensaje
1Pedido 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