602SQL-Úplná dokumentace Index  

Příkaz LOOP (SQL)

příkaz_LOOP ::= [ návěští : ] LOOP příkaz … END LOOP [ návěští ];

Příkazy (resp. složené příkazy) obsažené v příkazu LOOP se provádějí opakovaně, dokud se neprovede příkaz LEAVE nebo dokud nedojde k chybě.

Je-li uvedeno koncové návěští, pak musí být uvedeno také stejné počáteční návěští. Uvnitř příkazu LOOP nesmí být žádný příkaz označen stejným návěštím.

Velmi časté použití nachází LOOP při procházení záznamů kurzoru otevřeného příkazem OPEN (prakticky jediná možnost, jak lze tyto záznamy projít). K průchodu všemi záznamy kurzoru lze také použít příkaz FOR.


Příklad použití:

do tabulky vložit 10 záznamů a vzestupně je očíslovat

BEGIN ATOMIC 
  DECLARE i INT;      
  SET i = 1; 
  label: LOOP INSERT INTO Tab3 (cislo) VALUES (i); 
     IF i >= 10 THEN LEAVE label; END IF; 
     SET i = i + 1; 
  END LOOP label; 
END;

Příklad použití č. 2:

použití LOOP při procházení kurzoru:

PROCEDURE ZmenaCeniku();
BEGIN 
  DECLARE err_notfound BIT DEFAULT FALSE;
  DECLARE CONTINUE HANDLER FOR NOT FOUND 
    BEGIN SET err_notfound=TRUE;  END;
  DECLARE curcen SENSITIVE CURSOR FOR 
    SELECT cislo_pol, cena
    FROM Cenik
  FOR UPDATE; 
  DECLARE Polozka CHAR(20); 
  DECLARE Cena NUMERIC(14,2); 

  OPEN curcen; 
  LabelLoop: LOOP 
     FETCH NEXT FROM curcen INTO Polozka, Cena; 
     IF err_notfound IS TRUE THEN LEAVE LabelLoop; END IF; 
     CASE SUBSTRING(Polozka FROM 1 FOR 1)
       WHEN "X" THEN 
         UPDATE SET Cena = Cena*0.9 WHERE CURRENT OF curcen;
       WHEN "A" THEN 
         UPDATE SET Cena = Cena*2 WHERE CURRENT OF curcen;
       ELSE
         DELETE WHERE CURRENT OF curcen;
     END CASE; 
  END LOOP LabelLoop; 
  CLOSE curcen; 
END;