PL/SQL v příkladech / Cyklus FOR a WHILE
Pro cyklické opakování bloku kódu jsou v PL/SQL připraveny konstrukce FOR
a WHILE
. Pro pořádek uvádím na konci článku i obecnou smyčku LOOP
, kterou ovšem nedoporučuji používat.
FOR
Základní cyklus s pevně daným rozsahem. Stejně jako v jiných jazycích není iterační proměnnou nutné explicitně deklarovat, její platnost je tudíž omezena pouze na daný cyklus. Inkrementace probíhá automaticky.
BEGIN FOR i IN 1..5 LOOP dbms_output.put(i); END LOOP; dbms_output.new_line; -- 12345 END;
Velmi často se cyklus FOR
využívá pro průchod polem s konečným počtem prvků. V následujícím příkladu stojí za povšimnutí klíčová slova REVERSE
obracející směr průchodu a EXIT WHEN
sloužící pro předčasné ukončení smyčky.
DECLARE TYPE Number_TT IS TABLE OF NUMBER INDEX BY PLS_INTEGER; lt_Employee_ID Number_TT; BEGIN SELECT employee_id BULK COLLECT INTO lt_Employee_ID FROM employees WHERE (ROWNUM<11) -- omezení na 10 řádků ; FOR i IN REVERSE 1..lt_Employee_ID.COUNT LOOP dbms_output.put(lt_Employee_ID(i)||' '); EXIT WHEN lt_Employee_ID(i)=105; END LOOP; dbms_output.new_line; -- 109 108 107 106 105 END;
WHILE
Cyklus WHILE
nemá pevně specifikovaný rozsah, je omezen pouze podmínkou na začátku. Příklad ukazuje jeden ze způsobů, jak iterovat srze interval dní.
DECLARE -- hranice intervalu L_ZACATEK CONSTANT DATE:=TO_DATE('4.1.2016', 'DD.MM.YYYY'); L_KONEC CONSTANT DATE:=TO_DATE('7.1.2016', 'DD.MM.YYYY'); -- den sloužící jako čítač l_Den DATE; BEGIN l_Den:=L_ZACATEK; WHILE (l_Den<=L_KONEC) LOOP dbms_output.put(TO_CHAR(l_Den, 'DD')||' '); l_Den:=l_Den+1; END LOOP; dbms_output.new_line; -- 04 05 06 07 END;
V určitých situacích, typicky při více úrovních zanoření, může být užitečné pojmenování si cyklu. Přerušení je opět vyvoláno pomocí příkazu EXIT
následovaného jménem návěští.
DECLARE -- jako čítač je vhodné použít celočíselný typ z PL/SQL -- a "bezpečnou" klauzuli NOT NULL i PLS_INTEGER NOT NULL:=1; j PLS_INTEGER NOT NULL:=1; BEGIN <<vnejsi_smycka>> WHILE (i<11) LOOP WHILE (j<11) LOOP dbms_output.put(i||j||' '); EXIT vnejsi_smycka WHEN (j>2); j:=j+1; END LOOP; i:=i+1; END LOOP; dbms_output.new_line; -- 11 12 13 END;
LOOP
Obecná „nekonečná“ smyčka bez specifikace jak podmínky, tak rozsahu. Od verze Oracle 11g přibyla v PL/SQL podpora CONTINUE
a CONTINUE WHEN
pro přechod na další iteraci.
DECLARE i PLS_INTEGER NOT NULL:=0; BEGIN LOOP i:=i+1; CONTINUE WHEN (i<3); dbms_output.put(i||' '); EXIT WHEN (i>4); END LOOP; dbms_output.new_line; -- 3 4 5 END;