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é procedury21. Triggery
22. Uživatelsky definované funkce
23. Větvení kódu - podmínky a cykly
24. Práce s datem a časem