Salta el contingut

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.