ITERATE

ITERATE salta el resto del cuerpo del bucle y comienza la siguiente iteración. Es el equivalente a continue en lenguajes como JavaScript, Java o C. Solo se puede usar dentro de LOOP, WHILE y REPEAT.

Sintaxis

ITERATE etiqueta;

Ejemplo básico: saltar números pares

DELIMITER //
 
CREATE PROCEDURE solo_impares(IN limite INT)
BEGIN
    DECLARE i INT DEFAULT 0;
    DECLARE resultado VARCHAR(500) DEFAULT '';
 
    numeros: LOOP
        SET i = i + 1;
 
        IF i > limite THEN
            LEAVE numeros;
        END IF;
 
        -- Saltar números pares
        IF i MOD 2 = 0 THEN
            ITERATE numeros;
        END IF;
 
        SET resultado = CONCAT(resultado, i, ' ');
    END LOOP numeros;
 
    SELECT TRIM(resultado) AS impares;
END //
 
DELIMITER ;
CALL solo_impares(10);
impares
1 3 5 7 9

ITERATE en WHILE

DELIMITER //
 
CREATE PROCEDURE productos_caros_con_stock()
BEGIN
    DECLARE v_nombre VARCHAR(100);
    DECLARE v_precio DECIMAL(10,2);
    DECLARE v_stock INT;
    DECLARE v_done INT DEFAULT FALSE;
    DECLARE v_total INT DEFAULT 0;
 
    DECLARE cur CURSOR FOR
        SELECT nombre, precio, stock FROM productos WHERE activo = TRUE ORDER BY precio DESC;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = TRUE;
 
    DROP TEMPORARY TABLE IF EXISTS tmp_resultado;
    CREATE TEMPORARY TABLE tmp_resultado (
        nombre VARCHAR(100),
        precio DECIMAL(10,2),
        stock INT
    );
 
    OPEN cur;
 
    filtrar: WHILE NOT v_done DO
        FETCH cur INTO v_nombre, v_precio, v_stock;
 
        IF v_done THEN
            LEAVE filtrar;
        END IF;
 
        -- Saltar productos baratos
        IF v_precio < 500 THEN
            ITERATE filtrar;
        END IF;
 
        -- Saltar productos sin stock
        IF v_stock = 0 THEN
            ITERATE filtrar;
        END IF;
 
        INSERT INTO tmp_resultado VALUES (v_nombre, v_precio, v_stock);
        SET v_total = v_total + 1;
    END WHILE filtrar;
 
    CLOSE cur;
 
    SELECT * FROM tmp_resultado;
    SELECT v_total AS total_encontrados;
 
    DROP TEMPORARY TABLE tmp_resultado;
END //
 
DELIMITER ;
CALL productos_caros_con_stock();
nombrepreciostock
ASUS ROG Zephyrus1899.9912
Lenovo ThinkPad X11549.0018
MacBook Air M31399.0025
iPhone 15 Pro1299.9945
Samsung Galaxy S24899.9962
Samsung TV QLED 55"749.0020
Google Pixel 8699.0038
Xiaomi 14599.9980
Sofá 3 plazas599.008

FizzBuzz con ITERATE

DELIMITER //
 
CREATE PROCEDURE fizzbuzz(IN limite INT)
BEGIN
    DECLARE i INT DEFAULT 0;
 
    DROP TEMPORARY TABLE IF EXISTS tmp_fizzbuzz;
    CREATE TEMPORARY TABLE tmp_fizzbuzz (
        numero INT,
        valor VARCHAR(10)
    );
 
    fb: LOOP
        SET i = i + 1;
 
        IF i > limite THEN
            LEAVE fb;
        END IF;
 
        IF i MOD 15 = 0 THEN
            INSERT INTO tmp_fizzbuzz VALUES (i, 'FizzBuzz');
            ITERATE fb;
        END IF;
 
        IF i MOD 3 = 0 THEN
            INSERT INTO tmp_fizzbuzz VALUES (i, 'Fizz');
            ITERATE fb;
        END IF;
 
        IF i MOD 5 = 0 THEN
            INSERT INTO tmp_fizzbuzz VALUES (i, 'Buzz');
            ITERATE fb;
        END IF;
 
        INSERT INTO tmp_fizzbuzz VALUES (i, CAST(i AS CHAR));
    END LOOP fb;
 
    SELECT * FROM tmp_fizzbuzz;
    DROP TEMPORARY TABLE tmp_fizzbuzz;
END //
 
DELIMITER ;
CALL fizzbuzz(15);
numerovalor
11
22
3Fizz
44
5Buzz
6Fizz
77
88
9Fizz
10Buzz
1111
12Fizz
1313
1414
15FizzBuzz

LEAVE vs ITERATE

SentenciaEfectoEquivalente
LEAVESale del bucle completamentebreak
ITERATESalta a la siguiente iteracióncontinue

Limpieza

DROP PROCEDURE IF EXISTS solo_impares;
DROP PROCEDURE IF EXISTS productos_caros_con_stock;
DROP PROCEDURE IF EXISTS fizzbuzz;

En el siguiente artículo veremos los cursores, que permiten recorrer un conjunto de resultados fila por fila dentro de un procedimiento.

Escrito por Eduardo Lázaro