Поиск по сайту:
Час работы научит больше, чем день объяснения (Ж.-Ж. Руссо).

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

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 5,00 из 5)
Загрузка...
10.06.2021
Как установить MySQL на Ubuntu 16.04

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

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

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

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

 

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

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

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

Читать  Как установить Apache Cassandra в Ubuntu 20.04

 

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

Общий синтаксис объявления курсора в 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 (показанные выше), прежде чем использовать курсор.

Читать  Функция RANK в MySQL

Вам не нужно объявлять курсор после оператора закрытия.

Общий синтаксис закрытия курсора показан в запросе ниже:

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

Читать  Что такое dateiff в MySQL

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Если статья понравилась, то поделитесь ей в социальных сетях:

Читайте также

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

**ссылки nofollow

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Рекомендуемое
В режиме видео доступно меньше параметров съемки. Вы можете включить или…

Спасибо!

Теперь редакторы в курсе.