Хранимые функции онлайн урок.


Функции отличаются от процедур тем, что возвращают конкретное значение. Созданная функция может быть использована так же, как и обычные предопределенные функции MySQL.

Конструкция для определения функции выглядит так:

CREATE FUNCTION название ( параметры ) RETURNS тип данных [NOT] DETERMINISTIC
BEGIN
тело
END


Тут параметры не определяются типами IN, OUT, INOUT.

  • RETURNS определяет тип данных, который возвращает функция. Например RETURNS INT

  • [NOT] DETERMINISTIC определяет, будет ли функция детерминированной или нет. Детерминированная функция - это функция, которая от одинаковых значений параметров вернет всегда одинаковые значения.

  • В теле функции необходимо указать оператор RETURN и записать после него значение, которое будет возвращать функция


Рассмотрим пример. Создадим функцию, которая будет подсчитывать разницу между средним возрастом студентов и текущим возрастом студента (для каждого студента) и округлять значение.

DELIMITER $$

CREATE FUNCTION age_diff(a TINYINT) RETURNS FLOAT NOT DETERMINISTIC
BEGIN
DECLARE avg_age FLOAT DEFAULT 0;
SELECT AVG(age) INTO avg_age FROM student;
RETURN (ROUND(ABS(a - avg_age)));
END $$

DELIMITER ;

Теперь используем эту функцию в запросе:

SELECT name, age_diff(age) FROM student;

+---------+---------------+
| name | age_diff(age) |
+---------+---------------+
| Mike | 2 |
| John | 4 |
| Andy | 4 |
| Debra | 2 |
| Andy | 0 |
| Mike | 0 |
| Jeff | 2 |
| Stanley | 0 |
+---------+---------------+
8 rows in set (0.00 sec)

Тут мы использовали оператор DECLARE для объявления локальной переменной. После него мы записали название переменной, тип данных и начальное значение.