В этой статье вы найдете краткое описание использования курсоров MySQL в хранимой процедуре, хранимых функциях или триггерах для выполнения результата оператора SELECT.
В большинстве случаев при выполнении SQL-запросов с использованием оболочки MySQL или рабочей среды MySQL мы не сохраняем результаты, хотя у нас есть возможность сохранять результаты, обработанные сервером с использованием хранимой процедуры.
В этой статье мы не будем обсуждать хранимые процедуры, функции или триггеры. Вместо этого мы просто покажем вам, как можно использовать курсоры MySQL для выполнения результатов в хранимых процедурах.
Прежде чем мы начнем создавать и использовать курсор с примерами, давайте обсудим несколько ключевых моментов, касающихся курсора, о которых вам следует знать:
Теперь, когда мы знаем, что означает курсор, мы можем начать иллюстрировать, как он работает, на реальных примерах:
Общий синтаксис объявления курсора в MySQL прост. Начнем с использования ключевого слова DECLARE, как показано в примере запроса ниже:
DECLARE cursor_name CURSOR FOR SELECT_expression;
Cursor_name – это имя, присвоенное курсору во время объявления. Обратите внимание, что объявление курсора должно быть после любых объявленных переменных, чтобы MySQL не приводил к ошибкам.
Далее идет SELECT_expression, в котором хранится оператор SELECT, связанный с курсором.
Как только у нас объявлен курсор и MySQL знает, что курсор существует, мы можем начать его использовать, что требует открытия курсора.
Общий синтаксис для открытия курсора показан в запросе ниже:
OPEN cursor_name;
Эта команда открывает курсоры, на которые ссылается ее имя, и ее можно использовать.
Открытие курсора позволяет получить информацию, хранящуюся в процедуре, функции или триггере.
Общий синтаксис для выборки данных с помощью курсора следующий:
FETCH cursor_name INTO variables;
После завершения операций, требующих определенного курсора, лучше всего закрыть курсор, что освободит связанную с ним память.
После того, как курсор был закрыт, пользователю необходимо повторно открыть курсор, используя ключевые слова OPEN (показанные выше), прежде чем использовать курсор.
Вам не нужно объявлять курсор после оператора закрытия.
Общий синтаксис закрытия курсора показан в запросе ниже:
CLOSE cursor_name;
Курсор MySQL работает, рекурсивно считывая следующую строку в наборе результатов. Если следующая строка недоступна, курсор закроется и не вернет данные, если не указано иное. Это может быть проблемой, особенно после того, как курсор достигнет конца результата.
В качестве решения определяется обработчик NOT FOUND. Это определяет действие, которое необходимо предпринять, если следующая строка не найдена.
Общий синтаксис обработки ошибок при использовании курсора:
DECLARE CONTINUE HANDLER NOT FOUND SET terminate = true;
Конечное значение – это переменная, используемая для указания того, что курсор достиг конца результата. Имя переменной может быть любым, если оно соответствует соглашению об именах переменных MySQL.
Давайте создадим курсор, который собирает электронные письма клиентов, доступные в таблице клиентов образца базы данных Sakila.
Ресурс для загрузки и установки базы данных Sakila находится ниже:
https://dev.mysql.com/doc/sakila/en/
Ниже показана процедура, в которой для получения писем используется курсор:
USE sakila; DELIMITER $$ CREATE PROCEDURE createNewsletter( INOUT emails VARCHAR(4000) ) BEGIN DECLARE terminate INT DEFAULT FALSE; DECLARE emailAddr VARCHAR(255) DEFAULT ""; DECLARE collect_email CURSOR FOR SELECT email FROM sakila.customer WHERE (address_id > 100 AND address_id < 200); DECLARE CONTINUE HANDLER FOR NOT FOUND SET terminate = TRUE; OPEN collect_email; getEmails: LOOP FETCH collect_email INTO emailAddr; IF terminate = TRUE THEN LEAVE getEmails; END IF; SET emails = CONCAT(emailAddr, "|", emails); END LOOP getEmails; CLOSE collect_email; END$$ DELIMITER ; SET @emails = ""; CALL createNewsLetter(@collect_email); SELECT @collect_email;
После выполнения запроса вы получите результат, как показано ниже:
В этой статье мы рассмотрели использование курсоров MySQL для анализа данных, хранящихся в наборе результатов. Изучите документацию, чтобы понять, как реализовать курсоры.