Учебное пособие по курсору MySQL и пример кода

Учебное пособие по курсору MySQL и пример кода База данных

В этом руководстве вы найдете краткое описание использования курсоров MySQL в хранимой процедуре, хранимых функциях или триггерах для выполнения результата оператора SELECT.

В большинстве случаев при выполнении SQL-запросов с использованием оболочки MySQL или рабочей среды MySQL мы не сохраняем результаты, хотя у нас есть возможность сохранять результаты, обработанные сервером с помощью хранимой процедуры.

А также в этом руководстве я не буду обсуждать хранимые процедуры, функции или триггеры. Вместо этого я просто покажу вам, как можно использовать курсоры MySQL для выполнения результатов в хранимых процедурах.

Прежде чем мы начнем создавать и использовать курсор с примерами, позвольте нам обсудить несколько ключевых моментов, касающихся курсора, о которых вам следует знать:

Особенности курсора MySQL

  1. Курсор доступен только для чтения и не может обновлять или удалять данные в наборе результатов из процедуры.
  2. Курсор необходимо объявить, прежде чем его можно будет использовать. Определение курсора — это всего лишь шаг, чтобы сообщить MySQL, что такой курсор существует и не извлекает данные.
  3. Вы можете извлекать данные только в порядке, указанном оператором select, а не в любом обратном порядке, обычно известном как не прокручиваемый.
  4. Вы используете курсор, открывая его, а затем выполняя операции выборки сохраненных данных.
  5. Также Вы должны закрыть курсор после завершения операций выборки.

Теперь, когда мы знаем, что означает курсор, мы можем начать иллюстрировать, как он работает, на реальных примерах.

Основное использование

Общий синтаксис объявления курсора в MySQL прост. Начнем с использования ключевого слова DECLARE, как показано в примере запроса ниже/

Как объявить курсор

DECLARE cursor_name CURSOR FOR SELECT_expression;

Имя_курсора — это имя, присвоенное курсору во время объявления. Обратите внимание, что объявление курсора должно быть после любых объявленных переменных, чтобы MySQL не приводил к ошибкам.

Читайте также:  Оконная функция PostgreSQL NTILE

Далее идет 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 для анализа данных, хранящихся в наборе результатов. Изучите документацию, чтобы понять, как реализовать курсоры.

Оцените статью
bestprogrammer.ru
Добавить комментарий