Збережені функції
Крім форми CREATE PROCEDURE, що створює процедуру, допускається використання create function, яка створює функцію. Функція на відміну від процедури може викликатися безпосередньо, без використання оператора CALL і повертати одне значення, яке підставляється на місце виклику функції, як у випадку вбудованих функцій MySQL.
Створимо найпростішу функцію say_hello (), яка буде приймати єдиний вхідний параметр з ім'ям name і повертати фразу "Hello, name!", Де замість підрядка name буде підставлено значення параметра name (приклад).
Приклад:
CREATE FUNCTION say_hello (name CHAR(20)) RETURNS CHAR(50)
BEGIN
RETURN CONCAT(' Hello, ',name,'!');
END //
SELECT say_hello('world'), say_hello('softtime')//
say_hello('world') say_hello('softtime')
Hello, world! Hello, softtime!
Після оголошення параметрів функції слідує оператор returns, який задає тип повертається функцією значення. Повернути значення з функції можна за допомогою оператора return (наступний приклад), який може бути викликаний у будь-якій точці функції. Виклик оператора return означає, що функція повинна негайно завершити виконання і повернути значення, передане в якості аргументу оператора return.
Зауваження:
- При оголошенні параметрів функції використання ключових слів IN, INOUT і OUT неприпустимо Всі параметри, передані функції, є вхідними.
- Функція обов'язково повинна містити оператор returns, що встановлює тип значення функції, і хоча б один оператор return в тілі функції, який повертає це значення.
Приклад:
CREATE FUNCTION func_catalog (id INT)
RETURNS TINYTEXT
BEGIN
DECLARE catalog TINYTEXT;
SELECT name INTO catalog FROM catalogs
WHERE id_catalog = id LIMIT 1;
RETURN catalog;"
SELECT name INTO catalog FROM catalogs
WHERE id_catalog = id + 1 LIMIT 1;
RETURN catalog;
END //
SELECT func_catalog (1)//
func_catalog(1)
Процессори
Збережена функція func_catalog () приймає єдиний параметр id-первинний ключ таблиці catalogs. Прийнявши як параметр id значення 1, функція повертає результат ("процесори"), досягнувши першого оператора return. При цьому другий оператор select і return не досягаються ніколи (інакше поверталося б значення "Оперативна пам'ять"). Це не означає, що двох операторів return у тілі функції не повинно зустрічатися. Нижче будуть розглянуті умовні конструкції дозволяють в залежності від умов вибирати варіант, який повинен повертатися - в такій ситуації використання множинного виходу з функції за допомогою декількох операторів return не уникнути.
Якщо послідовність операторів, які вирішено оформити у вигляді збереженої процедури, повертає одне-єдине значення, набагато зручніше оформити їх у вигляді збереженої функції, т. к. працювати з ними у виразах набагато зручніше. Створимо дві функції: coun_jproduct_in_catalog () і count_product (), які будуть повертати загальне число товарних позицій в каталозі і загальне число товарних позицій в навчальному електронному магазині shop.
Приклад:
CREATE FUNCTION count_product_in_catalog (id INT)
RETURNS INT
BEGIN
DECLARE total INT;
SELECT SUM(count) INTO total FROM products
WHERE id_catalog = id LIMIT 1;
RETURN total;
END //
CREATE FUNCTION count_product ()
RETURNS INT
BEGIN
DECLARE total INT;
SELECT SUM(count) INTO total FROM products;
RETURN total;
END//
SELECT count_product_in_catalog(1) AS total,
count_product_in_catalog(1)/countjproduct()*100 AS persent//
total persent
56 26.5403
Як видно з прикладу, функції зручно використовувати у виразах, наприклад, для підрахунку процентного вкладу товарних позицій каталогу в загальне число товарів в електронному магазині shop.