popis_rutiny ::= { popis_procedury | popis_funkce }; popis_procedury ::= PROCEDURE [schΘma.]jmΘno ([ formßlnφ_parametr {, formßlnφ_parametr }à ]) ;
t∞lo
popis_funkce ::= FUNCTION jmΘno ([ formßlnφ_parametr {, formßlnφ_parametr }à ]) RETURNS typ;
t∞lo
formßlnφ_parametr ::= [ m≤d_parametru ] [ jmΘno ] typ [ DEFAULT v²raz ] m≤d_parametru ::= IN | OUT | INOUT
t∞lo
::=
p°φkaz
| EXTERNAL NAME
oznaΦenφ_externφ_rutiny
Ka₧dß rutina mu svoje jmΘno, pomocφ n∞ho₧ se volß. Dßle rutina obsahuje v²Φet formßlnφch parametr∙, jim₧ se p°i volßnφ rutiny p°i°adφ skuteΦnΘ parametry. Po zavolßnφ rutiny se provede jejφ t∞lo -jednoduch² nebo slo₧en² p°φkaz.
Je-li v t∞le rutiny v rßmci slo₧enΘho p°φkazu zavolßn p°φkaz LEAVE, je mo₧nΘ jako nßv∞Ütφ pou₧φt jmΘno rutiny.
M≤d parametru urΦuje zp∙sob p°edßvßnφ hodnoty parametru na zaΦßtku a konci provßd∞nφ rutiny. Pokud t∞lo neobsahuje specifikaci EXTERNAL, pak platφ tato pravidla: P°i zahßjenφ provßd∞nφ rutiny se hodnoty skuteΦn²ch parametr∙ s m≤dy IN (vstupnφ parametr) a INOUT (vstupn∞-v²stupnφ parametry) zkopφrujφ do formßlnφch parametr∙. Po skonΦenφ provßd∞nφ rutiny se hodnoty formßlnφch parametr∙ s m≤dy OUT (v²stupnφ parametry) a INOUT zkopφrujφ (zp∞t) do skuteΦn²ch parametr∙. Pokud m≤d nenφ uveden, pak se v p°φpad∞ funkce p°edpoklßdß IN, v p°φpad∞ procedury se odvodφ ze zachßzenφ s formßlnφm parametrem v t∞le procedury takto: parametry, jejich₧ hodnota se Φte, majφ m≤d IN, parametry, do nich₧ se zapisuje, m≤d OUT, a parametry, jejich₧ hodnota se Φte i p°episuje, m≤d INOUT.
Pokud p°i volßnφ rutiny nenφ n∞kter² parametr uveden, pak p°φsluÜn² formßlnφ parametr bude mφt hodnotu v²razu uvedenΘho za DEFAULT. Nenφ-li takov² v²raz uveden, bude hodnota parametru NULL. Je-li m≤d takovΘho parametru OUT nebo INOUT, nezapφÜe se p°i ukonΦenφ rutiny hodnota formßlnφho parametru nikam.
JmΘno parametru lze ve specifikaci formßlnφho parametru vynechat. Na takov² parametr se vÜak nelze v t∞le odvolßvat. Vynechßnφ jmΘna mß proto smysl pouze u externφch rutin.
Rutina, v jejφm₧ t∞le je specifikovßno EXTERNAL, je implementovßna v externφ knihovn∞ DLL. OznaΦenφ externφ rutiny je °et∞zec znak∙ ve tvaru æjmΘno_funkce@jmΘno_knihovnyÆ
. Ve jmΘn∞ knihovny lze uvΘst cestu - pokud cesta uvedena nenφ, hledß se podle pravidel operaΦnφho systΘmu. Pokud knihovna nenφ nalezena nebo pokud v knihovn∞ nenφ nalezena funkce uvedenΘho jmΘna, nastane chybov² sqlstate 38001.
Pro p°edßvßnφ parametru do externφch rutin platφ p°φsnß pravidla definujφcφ vztah mezi formßlnφmi parametry uveden²mi v deklaraci a parametry volan²ch rutin vytvo°en²ch v externφm jazyce. Viz Volßnφ externφch rutin a p°edßvßnφ parametr∙.
Hodnota funkce nesmφ b²t typu Podpis, Historie, Datumovka, ukazatele nebo multiatribut. Typ formßlnφch parametr∙ rutin nesmφ b²t multiatribut.
RozÜφ°enφ jazyka SQL proti norm∞
P°φklad pou₧itφ: (z aplikace Knihovna)
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-li rezervace jedinß DELETE WHERE CURRENT OF pomc; // sma₧ zßznam v tab. Rezervace
END; END FOR; END