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

22. Uživatelsky definované funkce

Podle názvu Vám může uživatelsky definovaná funkce (neboli UDF) znít podobně jako uložená procedura, jde však o poměrně odlišnou věc. Jde o vlastní funkce, které následně můžeme používat v našich dotazech, podobně jako zakladní funkce MySQL (CONCAT, UPPER, TRIM a mnoho dalších).

Jak vlastní funkci vytvořit? Definici začneme klíčovými slovy CREATE FUNCTION, následuje název a v závorkách případné parametry a jejich datové typy. Na dalším řádku definujeme návratový typ pomocí klíčového slova RETURNS (pozor, na konci je písmeno s). Poté již mezi BEGIN a END následuje samotná definice na jejímž konci bude klíčové slovo RETURN a návratová hodnota.

Vlastní funkce se většinou vytvářejí k určitému formátování výstupních dat, takový příklad si vyzkoušíme i my. Mějme tabulku filmy, kde máme uložené informace o filmech. Jedním ze sloupců je hodnocení, které máme vyjádřené floatem v rozsahu 0-10. Na výpisu ale budeme chtít používat procentuální zaokrouhlené vyjádření, tedy například místo 9.89 chceme 99%. Nejdříve si vytvoříme tabulku a naplním ji daty:

CREATE TABLE `filmy` (
`film_id` int(10) NOT NULL PRIMARY KEY AUTO_INCREMENT,
`nazev` varchar(100) COLLATE utf8_czech_ci NOT NULL,
`hodnoceni` float NOT NULL
);

INSERT INTO `filmy` (`film_id`, `nazev`, `hodnoceni`) VALUES
(1, 'První krev', 9.89),
(2, 'Rocky III', 9.82),
(3, 'Kmotr', 8.63);


Nyní si musíme vytvořit vlastní funkci, která bude toto přeformátování řešit. Dosáhnout požadovaného tvaru lze snadno kombinací funkcí ROUND pro zaokrouhlení a CONCAT pro spojení řetězců:

CREATE FUNCTION procenta (hodnoceni FLOAT)
RETURNS VARCHAR (4)
BEGIN
RETURN CONCAT(ROUND(hodnoceni * 10), '%');
END


Pokud Vám databáze vrátí chybu, jde o problém s oddělovačem, který je řešen v článku o uložených procedurách. Pokud se funkce uložila v pořádku, najdete ji stejně jako procedury nebo triggery ve stromovém menu v levé části PhpMyAdminu. V tuto chvíli ji můžeme libovolně využívat v našich dotazech a hned si to vyzkoušíme:

SELECT nazev, procenta(hodnoceni)
FROM `filmy`


A jako výsledek dostáváme přesně to co jsme chtěli:
+------------+---------------------+
| nazev      | procenta(hodnoceni) |
+------------+---------------------+
| První krev | 99%                 |
| Rocky III  | 98%                 |
| Kmotr      | 86%                 |
+------------+---------------------+


Stejně jako u triggerů bychom neměli v rámci vlastních funkcí nahrazovat aplikační logiku, ale pokud potřebujeme řešit pouze drobnější formátování, jde o vhodnou možnost.


Další díly tutoriálu

20. Uložené procedury
21. Triggery
22. Uživatelsky definované funkce
23. Větvení kódu - podmínky a cykly
24. Práce s datem a časem