P°φkaz FOR (SQL)

p°φkaz_FOR ::= [ nßv∞Ütφ : ] FOR °φdicφ_prom∞nnß AS [ jmΘno_kurzoru [ SENSITIVE | INSENSITIVE] CURSOR FOR ] specifikace_kurzoru 
DO p°φkazà END FOR [ nßv∞Ütφ ];

P°φkaz FOR slou₧φ k zopakovßnφ posloupnosti p°φkaz∙ pro vÜechny °ßdky odpov∞di na dotaz zadanΘho specifikacφ kurzoru. Provßd∞nφ p°φkazu skonΦφ p°edΦasn∞ tehdy, provede-li se p°φkaz LEAVE na vn∞jÜφ nßv∞Ütφ nebo dojde k v²jimce.

p°φkazech obsa₧en²ch uvnit° p°φkazu FOR lze s hodnotami sloupc∙ na aktußlnφm °ßdku kurzoru pracovat pomocφ zßpisu ve tvaru:

°φdicφ_prom∞nnß.jmΘno_sloupce

Lze pou₧φt nap°. pro p°edßnφ hodnoty sloupce procedu°e - viz p°φklad 2. Pokud vÜak p°i°adφte sloupci novou hodnotu, na datech v databßzi se to neprojevφ.

Pro editaci sloupce je nutno pou₧φt p°φkazu UPDATE CURRENT OF, pak se na sloupce odkazuje pouze jejich jmΘnem, bez °φdicφ prom∞nnΘ (viz p°φklad 1).

Je-li uvedeno koncovΘ nßv∞Ütφ, pak musφ b²t uvedeno takΘ stejnΘ poΦßteΦnφ nßv∞Ütφ. Uvnit° p°φkazu FOR nesmφ b²t ₧ßdn² p°φkaz oznaΦen stejn²m nßv∞Ütφm.

V²znam specifikace kurzoru a specifikacφ SENSITIVE a INSENSITIVE je popsßn v Φßsti o deklaraci kurzoru.

Je-li uvedeno jmΘno kurzoru, lze toto jmΘno uvnit° p°φkazu FOR pou₧φvat v p°φkazech UPDATE CURRENT OF a DELETE CURRENT OF, ale nikoli v p°φkazech OPEN, CLOSE nebo FETCH.

P°φklad pou₧itφ Φ.1:

Zm∞≥te cenu u polo₧ek cenφku takto: polo₧ky cenφku zaΦφnajφcφ na X +10%, zaΦφnajφcφ na A +100%, ostatnφ smazat.

PROCEDURE ZmenaCeniku();
BEGIN 
  FOR radek AS curcen SENSITIVE CURSOR FOR 
    SELECT cislo_pol, cena
    FROM Cenik
  DO 
    BEGIN
     IF SUBSTRING(radek.cislo_pol FROM 1 FOR 1) = "X" THEN 
       UPDATE  SET cena = cena*1.1 WHERE CURRENT OF curcen;
     ELSEIF SUBSTRING(radek.cislo_pol FROM 1 FOR 1) = "A" THEN 
       UPDATE  SET cena = cena*2 WHERE CURRENT OF curcen;
     ELSE
       DELETE WHERE CURRENT OF curcen;
     END IF;
    END;
  END FOR;
END;

P°φklad pou₧itφ Φ.2:

P°φklad z aplikace Knihovna - zruÜit rezervace knih, kterΘ jsou rezervovßny dΘle ne₧ limit.

PROCEDURE CancelRes(IN lim INT);
BEGIN

  DECLARE PROCEDURE CheckResBook(code CHAR(8));  // pomocnß lokßlnφ procedura
  BEGIN
    DECLARE pocet INT;
    SELECT COUNT(co) INTO pocet                // kolikrßt je danß kniha rezervovßna?
    FROM Rezervace
    WHERE Rezervace.co = code;

    IF pocet = 1 THEN                          // pouze jednou, pak odstra≥ oznaΦenφ
      UPDATE Knihy
      SET Knihy.rezervovana = FALSE
      WHERE Knihy.kod = code;
    END IF;
  END;

  FOR radek AS pomc SENSITIVE CURSOR FOR      // pro vÜechny rezervace po limitu prove∩
    SELECT * 
    FROM Rezervace
    WHERE CURRENT_DATE - Rezervace.dat_rez > lim
  DO BEGIN
      CALL CheckResBook(radek.co);            // zm∞≥ p°φznak Rezervovano v tabulce Knihy, je-lirezervace jedinß
      DELETE WHERE CURRENT OF pomc;           // sma₧ zßznam v tab. Rezervace
    END;
  END FOR;
END