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();| nombre | precio | stock |
|---|---|---|
| ASUS ROG Zephyrus | 1899.99 | 12 |
| Lenovo ThinkPad X1 | 1549.00 | 18 |
| MacBook Air M3 | 1399.00 | 25 |
| iPhone 15 Pro | 1299.99 | 45 |
| Samsung Galaxy S24 | 899.99 | 62 |
| Samsung TV QLED 55" | 749.00 | 20 |
| Google Pixel 8 | 699.00 | 38 |
| Xiaomi 14 | 599.99 | 80 |
| Sofá 3 plazas | 599.00 | 8 |
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);| numero | valor |
|---|---|
| 1 | 1 |
| 2 | 2 |
| 3 | Fizz |
| 4 | 4 |
| 5 | Buzz |
| 6 | Fizz |
| 7 | 7 |
| 8 | 8 |
| 9 | Fizz |
| 10 | Buzz |
| 11 | 11 |
| 12 | Fizz |
| 13 | 13 |
| 14 | 14 |
| 15 | FizzBuzz |
LEAVE vs ITERATE
| Sentencia | Efecto | Equivalente |
|---|---|---|
| LEAVE | Sale del bucle completamente | break |
| ITERATE | Salta a la siguiente iteración | continue |
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
