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;