|
![]() | Rutiny uloženΘ na serveru | Vytvo°enφ rutiny (CREATE PROCEDURE | FUNCTION) | ![]() |
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 (resp. so na Linuxu). 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 (prom∞nnß PATH). Pokud u jmΘna knihovny chybφ p°φpona, doplnφ se ve Windows .DLL
a na Linuxu .so
. Dφky tomu je mo₧nΘ psßt jeden k≤d pro ob∞ prost°edφ - stejnß externφ funkce se najde v obou prost°edφch.
Pokud knihovna nenφ nalezena nebo pokud v knihovn∞ nenφ nalezena funkce uvedenΘho jmΘna, nastane chybov² sqlstate 38001resp. W0224. Pokud nenφ knihovna v adresß°i, ze kterΘho je povoleno spouÜt∞t knihovny, nastane chyba W0223.
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
Viz
![]() | Rutiny uloženΘ na serveru | Vytvo°enφ rutiny (CREATE PROCEDURE | FUNCTION) | ![]() |