Syntaxe rutiny (SQL)

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