Начиная с версии MySQL 5.0 были добавлены хранимые функции и процедуры – набор SQL команд, представляющие собой программную логику сохраняемую в БД, которую в последствии можно будет вызвать.
Преимущества использования:
Хранимые подпрограммы сохраняются внутри таблицы proc базы mysql.
Для работы с хранимыми подпрограммами необходимы такие привилегии для пользователя: CREATE ROUTINE, ALTER ROUTINE, EXECUTE.
Набор команд используемых вместе с хранимыми подпрограммами:
Название | Описание |
---|---|
CREATE PROCEDURE | создание процедуры |
CREATE FUNCTION | создание функции |
ALTER PROCEDURE | изменение процедуры |
ALTER FUNCTION | изменение функции |
DROP PROCEDURE | удаление процедуры |
DROP FUNCTION | удаление функции |
SHOW CREATE PROCEDURE proc_name | показать текст процедуры proc_name |
SHOW CREATE FUNCTION func_name | показать текст функции func_name |
SHOW PROCEDURE STATUS LIKE ‘proc_name’ | показать характеристики процедуры proc_name |
SHOW FUNCTION STATUS LIKE ‘func_name’ | показать характеристики функции func_name |
CALL proc_name() | вызвать процедуру proc_name |
DECLARE | определение локальных переменных |
SET | изменение значений локальных и глобальных переменных |
SELECT … INTO | сохранение значения указанного столбца в переменную |
IF | условный оператор if-then-else-end |
CASE … WHEN | оператор выбора |
LOOP,REPEAT,WHILE | циклы |
RETURNS | возвращение значения из функции |
Создание и изменение переменой:
DECLARE val INT DEFAULT 0; SET val = 5;
Создание функции:
DELIMITER // CREATE FUNCTION func() RETURNS INTEGER BEGIN DECLARE val INTEGER; SELECT id INTO val FROM table; RETURN IFNULL(val, 0); END// DELIMITER ;
DELIMITER указывает на символ-разделитель строки с командой, т.к. внутри CREATE FUNCTION есть набор вложенных команд, то для них мы оставляем стандартный разделитель ; а для указания завершения самой CREATE FUNCTION указываем //
Выполнение созданной функции:
SELECT func();
Удаление созданной функции:
DROP FUNCTION IF EXISTS func;
Просмотр хранимых подпрограмм в БД dbname
SELECT ROUTINE_TYPE, ROUTINE_NAME FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA='dbname';
Дополнительное чтиво: