|
![]() | P°φkaz LEAVE | ![]() | ╪φdφcφ p°φkazy | P°φkaz CALL - volßnφ procedury | ![]() |
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 chyb∞.
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 opaΦn∞ 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). Kurzor v tomto p°φpad∞ nesmφ b²t INSENSITIVE - pokud ano, zm∞ny se neulo₧φ.
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
![]() | P°φkaz LEAVE | ![]() | ╪φdφcφ p°φkazy | P°φkaz CALL - volßnφ procedury | ![]() |