|
![]() | Příkaz IF | ![]() | Řídící příkazy | Příkaz LOOP | ![]() |
příkaz_CASE ::= jednoduchý_příkaz_CASE | vyhledávací_příkaz_CASE
jednoduchý_příkaz_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 (SQ_CASE_NOT_FOUND_STMT).
Dojde-li při provádění posloupnosti příkazů k chybě, pokračuje se dále v závislosti na dostupném handleru této chyby. 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%, ostatní smazat (obdoba příkladu u FOR)
PROCEDURE ZmenaCeniku();
BEGIN
FOR radek AS curcen SENSITIVE CURSOR FOR
SELECT id_pol, cena
FROM Cenik
DO
BEGIN
CASE SUBSTRING(radek.id_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;
![]() | Příkaz IF | ![]() | Řídící příkazy | Příkaz LOOP | ![]() |