p°φkaz_CASE
::=
jednoduch²_p°φkaz_CASE
|
vyhledßvacφ_p°φkaz_CASE jednoduch²_p°φka
z_CASE ::= CASE v²raz { WHEN v²raz2 THEN
p°φkaz
à }à [ ELSE
p°φkaz
à ] END CASE;
vyhledßvacφ_p°φkaz_CASE
::= CASE { WHEN podmφnka THEN
p°φkaz
à }à [ ELSE
p°φkaz
à ] END CASE;
P°φkaz CASE slou₧φ k v²b∞ru a provedenφ jednΘ z n∞kolika mo₧n²ch posloupnostφ p°φkaz∙. JednotlivΘ posloupnosti jsou uvedeny ve v∞tvφch zaΦφnajφcφch WHEN nebo ELSE.
V jednoduchΘm p°φkazu CASE se hodnota v²razu hledß po °ad∞ ve v∞tvφch mezi hodnotami v²raz∙2. Ve vyhledßvacφm p°φkazu CASE se po °ad∞ hledß v∞tev, v nφ₧ je podmφnka spln∞nß. Nalezne-li se takovß v∞tev, provedou se p°φkazy v tΘto v∞tvi nßsledujφcφ za THEN.
Pokud nenφ nalezena ₧ßdnß vyhovujφcφ v∞tev, pak obsahuje-li p°φkaz v∞tev s ELSE, provedou se p°φkazy za ELSE. Jinak nastane chybov² sqlstate 20000.
Dojde-li p°i provßd∞nφ posloupnosti p°φkaz∙ k v²jimce, pokraΦuje se dßle v zßvislosti na dostupnΘm handleru tΘto v²jimky. Nenφ-li nalezen CONTINUE handler, provßd∞nφ p°φkaz∙ v posloupnosti se ukonΦφ.
OdliÜnosti od normy
P°φklad pou₧itφ:
vyhledßvacφ CASE (obdoba p°φkladu u IF)
TRIGGER befupd BEFORE UPDATE OF CISLO ON Tab3
REFERENCING NEW ROW AS novaradka
FOR EACH ROW
BEGIN
CASE
WHEN novaradka.cislo < 0 THEN
SET novaradka.cislo=-novaradka.cislo;
END CASE;
END
jednoduch² CASE
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%, zaΦφnajφcφ na B smazat (obdoba p°φkladu u FOR)
PROCEDURE ZmenaCeniku();
BEGIN
FOR radek AS curcen SENSITIVE CURSOR FOR
SELECT cislo_pol, cena
FROM Cenik
DO
BEGIN
CASE SUBSTRING(radek.cislo_pol FROM 1 FOR 1)
WHEN "X" THEN
UPDATE SET cena = cena*1.1 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;
END FOR;
END;