Введение в хранимые функции MySQL 5
Life-HackХранимые процедуры MySQL (часть 2)
В этой части статьи допишем начатую в предыдущей статье хранимую процедуру и научимся создавать хранимые mysql функции.
И так нам осталось указать значение для последней переменной PostID. В качестве значения ей будет присвоен результат, который вернёт функция GetPostID, которую сейчас и создадим.
Создание функции
Для начала закрываем текущую форму создания процедуры, нажав на кнопку c надписью Go. Затем в этом же окне снова нажимаем на надпись Add routine, появится знакомая форма, заполним её.
Имя - GetPostID
Тип - функция
Parameters - ComID BIGINT(20) UNSIGNED
Return type (возвращаемый тип) - BIGINT
Return length/values - 20
Return options - UNSIGNED
Definition:
BEGIN
RETURN (SELECT comment_post_ID
FROM wp_comments
WHERE comment_ID = ComID);
END;
Так же можно указать дополнительные параметры:
Is deterministic — детерминированная функция всегда возвращает один и тот же результат при одинаковых входных параметрах иначе она является не детерминированной. В нашем случае ставим галочку.
Definer и Security type параметры безопасности, в данном примере оставим их без изменений.
SQL data access имеет несколько значений:
NO SQL — не содержит sql.
Contains SQL — содержит встроенные sql функции или операторы, которые не читают, не пишут и не изменяют данные в базе данных. Например, установка значения переменной: SET name = значение;
READS SQL DATA — только чтение данных, без любой модификации данных, указывается для запроса SELECT.
MODIFIES SQL DATA — изменение или внесение данных, в базу данных, указывается для запросов: INSERT, UPDATE, но при этом не должен присутствовать запрос SELECT.
В нашей функции используется запрос SELECT, укажем READS SQL DATA.
Comment комментарий.
После того как все поля заполнены, нажимаем на кнопку с надписью Go.
Возвращаемся на вкладку Routines и отредактируем нашу процедуру, нажав на кнопку edit.
Присвоим переменой PostID в качестве значения результат, который вернёт функция GetPostID.
SET postID = GetPostID(ComID);
В результате окончательное тело процедуры будет таким
BEGIN
DECLARE Author tinytext DEFAULT 'admin';
DECLARE UserID bigint(20) DEFAULT 1;
DECLARE Email varchar(100);
DECLARE Date DATETIME DEFAULT NOW();
DECLARE ParentCom varchar(20);
DECLARE Approved varchar(20);
DECLARE PostID BIGINT(20);
IF Author = 'admin' THEN
SET Approved = 1;
ELSE
SET Approved = 0;
END IF;
SET ParentCom = ComID ;
SET Email = 'adm@local.local';
SET PostID = GetPostID(ComID);
INSERT INTO wp_comments (comment_author, comment_author_email,
comment_content, comment_date,
comment_date_gmt, comment_post_id,
comment_parent, comment_approved, user_id)
VALUES (Author, Email, Content, Date, Date, PostID, ParentCom,
Approved, UserID);
END;
Остальные поля формы оставим без изменений, нажимаем на кнопку Go. Процедура создана.
Так же можно установить значения для одной или нескольких переменных в результате выполнения запроса. Например, поля: Автор, почта и id пользователя хранятся в таблице wp_users.
Зная это можно установить значения для этих переменных следующим образом:
BEGIN
-- Объявляем переменные
DECLARE Author tinytext DEFAULT 'admin';
DECLARE UserID bigint(20) DEFAULT 1;
DECLARE Email varchar(100);
-- выполнение запроса и установка значений для переменных
SELECT user_login, user_email, ID
INTO Author, Email, UserID
FROM wp_users
WHERE user_login LIKE 'adm%';
END;
Вызов хранимой процедуры
Осталось протестировать созданную процедуру. Для начала добавим комментарий к любой статье, одобрим его и проверим, чтобы он отображался на странице.
Затем узнаем id добавленного комментария
Возвращаемся на вкладку Routines и нажимаем на надпись Execute
Появится форма
Указываем значения передаваемых параметров: текст ответа и id комментария, после чего нажимаем на кнопку с надписью Go.
Если ошибок нет, то открываем страницу и смотрим на результат.
Второй способ выполнить процедуру на сервере.
Открываем вкладку SQL
С помощью оператора CALL производим вызов нашей процедуры
Если ошибок нет, то должны увидеть новый комментарий на странице.