CREATE FUNCTION

Збережені функції

Крім форми 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.