DAM - DAW - MP 0484 Bases de Dades - NF5
Estructures iteratives
Les estructures iteratives bàsiques són: LOOP, REPEAT i WHILE i FOR.
A les estructures d’iteració veureu que es pot especificar un nom d’etiqueta al principi i/o al final (begin_label i end_label). Aquestes s’utilitzen en clàusules que trenquen l’estructura de la programació (millor no haver-les d’utilitzar) però les hem deixades perquè el llenguatge les incorpora.
Manuals sobre etiquetes a: https://mariadb.com/kb/en/labels/.
WHILE i REPEAT
Aquestes dues estructures, WHILE i REPEAT repetitives són les que segueixen la metodologia de programació estructurada.
WHILE
[begin_label:] WHILE search_condition DO
statement_list
END WHILE [end_label];
REPEAT
[begin_label:] REPEAT
statement_list
UNTIL search_condition
END REPEAT [end_label];
Exemple WHILE
BEGIN NOT ATOMIC
DECLARE v_i INT DEFAULT 1;
DECLARE v_taula INT DEFAULT 7;
DECLARE v_maxim INT DEFAULT 12;
SELECT CONCAT_WS(' ', 'Taula del', v_taula);
WHILE v_i <= v_maxim DO
SELECT CONCAT_WS(' ', v_taula, 'x', v_i, '=', v_taula * v_i);
SET v_i = v_i + 1;
END WHILE;
END;
Fixa’t com la línia del WHILE porta DO al final.
Exemple REPEAT
BEGIN NOT ATOMIC
DECLARE v_i INT DEFAULT 1;
DECLARE v_taula INT DEFAULT 7;
DECLARE v_maxim INT DEFAULT 12;
SELECT CONCAT_WS(' ', 'Taula del', v_taula);
REPEAT
SELECT CONCAT_WS(' ', v_taula, 'x', v_i,
'=', v_taula * v_i#);
SET v_i = v_i + 1;
UNTIL v_i > v_maxim
END REPEAT;
END;
Fixa’t com la línia de l'UNTIL no acaba en punt i coma (;)
FOR
L’estructura repetitiva FOR, la podem utilitzar per iterar amb variables o bé en Cursors.
[begin_label:]
FOR var_name IN [ REVERSE ] lower_bound .. upper_bound DO
statement_list
END FOR [ end_label ];
No cal declarar la variable var_name
En el moment de posar els valors que agafarà la variable sempre cal posar primer el menor i després el major, encara que vulguem fer el recorregut a l’inrevés.
Exemple FOR
BEGIN NOT ATOMIC
DECLARE v_taula INT DEFAULT 7;
DECLARE v_maxim INT DEFAULT 12;
SELECT CONCAT_WS(' ', 'Taula del', v_taula);
FOR v_i IN 1 .. v_maxim DO
SELECT CONCAT_WS(' ', v_taula, 'x', v_i, '=', v_taula * v_i);
END FOR;
END;
Fixa’t com la no cal declarar la variable v_i que utilitzem al FOR.
LOOP
L’estructura repetitiva LOOP és molt senzilla i sembla un bucle infinit.
LOOP implementa una repetició infinita de manera que només podem sortir d’ella amb la comanda LEAVE.
Aquesta no serà una bona opció en programació estructurada.
[begin_label:] LOOP
statement_list
END LOOP [end_label];
LEAVE
LEAVE podem utilitzar-ho amb les comandes LOOP, REPEAT, i WHILE o en un bloc BEGIN .. END
LEAVE significa surt de la iteració /bloc.
LEAVE label;
Per utilitzar LEAVE, cal que la iteració o bloc de la qual volem sortir, estigui etiquetada.
Exemple LOOP
BEGIN NOT ATOMIC
DECLARE v_i INT DEFAULT 1;
DECLARE v_taula INT DEFAULT 7;
DECLARE v_maxim INT DEFAULT 12;
SELECT CONCAT_WS(' ', 'Taula del', v_taula);
l_iteracio: LOOP
SELECT CONCAT_WS(' ', v_taula, 'x', v_i, '=', v_taula * v_i);
SET v_i = v_i + 1;
IF v_i > v_maxim THEN
LEAVE l_iteracio;
END IF;
END LOOP l_iteracio;
END;
Hem utilitzat un IF i un LEAVE per sortir de la iteració.
Iteracions niades
Podem niar tantes iteracions com necessitem.
BEGIN NOT ATOMIC
DECLARE v_i INT;
DECLARE v_taula INT DEFAULT 1;
DECLARE v_maxim INT DEFAULT 12;
DECLARE v_taules INT DEFAULT 10;
WHILE v_taula <= v_taules DO
SELECT CONCAT_WS(' ', 'Taula del', v_taula);
SET v_i = 1;
FOR v_i IN 1 .. v_maxim DO
SELECT CONCAT_WS(' ', v_taula, 'x', v_i, '=', v_taula * v_i);
END FOR;
SET v_taula = v_taula + 1;
END WHILE;
END;
Aquí dalt hem niat un FOR dins d'un WHILE.