Nikdy nevíš, kdy to přijde
Zobrazit menu   MENU

20. Uložené procedury

Databázové procedury jsou sady SQL příkazů, které jsou uloženy na databázovém serveru. Jsou uloženy pod určitým názvem, který poté můžeme volat a vykonat vlastní kód procedury. Dá se říci že jsou "zkompilované", ale v jiném významu než běžně v programování myslíme. Optimalizátor serveru si pro uloženou proceduru sestaví vlastní plán jak ji provádět a při opakovaných volaních je tak provedení rychlejší (obecně platí až pro složitější procedury).

Procedury mohou a nemusí obsahovat vstupní parametry, které se pak v jejich kódu používají. Uvnitř procedur můžete využívat všechny bežné SQL příkazy. Pojďme zkusit nějakou jednoduchou proceduru vytvořit. Používat budeme databázi vytvořenou v minulém díle tutoriálu. Začínáme klíčovými slovy CREATE PROCEDURE, poté následuje název a povinné závorky. Mezi BEGIN a END pak uvedeme jednotlivé příkazy:

CREATE PROCEDURE pr_ziskej_ucty()
BEGIN
SELECT * FROM ucty;
END


Tímto jednoduchým kódem jsme se vytvořili proceduru nazvanou pr_ziskej_ucty, která vypisuje celou tabulku ucty. Pokud jste se pokusili tento kód spustit, pravděpodobně Vám phpMyAdmin nebo terminál vrátil chybu. Protože se v těle procedury používá středník, který je rezervovaný jako znak pro odělovaní příkazů, vzníká tím problém. Proto musíme jako oddělovací znak nastavit jiný (nebo sekvenci znaků). V našem případě využijeme znaky "/\". Pokud používáte phpMyAdmin, uveďte tyto znaky jako oddělovač do políčka pod hlavním polem pro zadávání SQL příkazů.

V tuto chvíli by Vám již kód měl projít bez problémů a databáze ohlásit uložení procedury. Kde nyní uložené procedury nalezneme? V phpMyAdmin rozklikněte vlevo vaší databází a v horním menu poté uvidíte položku Rutiny nebo jako další položku po rozkliknutí databáze v levém stromovém menu. Pokud je chcete vypsat v terminálovém prostředí, pak příkazem:

SHOW PROCEDURE STATUS;


Proceduru máme nyní uloženou a můžeme ji zavolat. To provedeme jednoduše pomocí klíčového slova CALL:

CALL pr_ziskej_ucty();



Procedury s parametry

Předchozí příklad byl maximálně zjednodušený a v reálu by příliš užitečný nebyl. Abychom mohli skutečně využívat plnou sílu procedur, musíme si ukázat jak využívat parametry. Každá procedura může mít neomezený počet vstupních parametr (stějně jako funkce a metody v programovacích jazycích). Každý parametr má svůj datový typ, který musíme při volání respektovat. Pokud bychom použili špatný, databáze nám vrátí minimálně warning, spíše však error.

Parametry procedur jsou povinné, pokud ale chceme hodnotu vynechat, můžeme jako parametr použít NULL.


Jako proceduru s parametry a vyzkoušíme vložení nového řádku do tabulky. Vytvoříme si proceduru pr_vloz_ucet() s parametry jmeno a zustatek:

CREATE PROCEDURE pr_vloz_ucet(jmeno varchar(50), zustatek float)
BEGIN
INSERT INTO ucty (klient, aktualni_zustatek) values (jmeno, zustatek);
END


Nyní můžeme jednoduše vložit nový řádek pomocí procedury:

CALL pr_vloz_ucet('Lukáš Hroch', 200);


Když zkontrolujeme tabulku ucty, uvidíme nový řádek. Na první pohled tento příklad neskýtá žádné výhody oproti běžnému insertu. Výhodou by určitě byla rychlost, pokud bychom vkládali velké množství dat, použítí procedury by určitě bylo rychlejší. Hlavní výhoda by se ale ukázala až při navázání další funkcionality. Oproti insertu bychom v proceduře mohli provést více úkonů (například uložit záznam o vytvoření účtu, odečíst poplatek za založení atd.).


Další díly tutoriálu

18. Jak správně používat indexy
19. Transakce
20. Uložené procedury
21. Triggery
22. Uživatelsky definované funkce