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.
V 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 t
abulce Knihy, je-lirezervace jedinß
DELETE WHERE CURRENT OF pomc; // sma₧ zßznam v tab. Rezervace
END; END FOR; END