PL/SQL v příkladech / Cyklus FOR a WHILE
Stručný seriál, který krok po kroku představí konstrukce jazyka PL/SQL společnosti Oracle na jednoduchých příkladech. Předpokládá znalost základních principů procedurálního programování.

Pro cyklické opakování bloku kódu jsou v PL/SQL připraveny konstrukce FORWHILE. 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 CONTINUECONTINUE 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;


ZANECHTE KOMENTÁŘ


Velké díky pro teslathemes