Курсоры MySQL перемещаются по строкам в таблице. Хорошо ... но зачем их использовать? В этом сообщении блога мы рассмотрим CURSOR в хранимой процедуре, которая возвращает конкретные интересующие записи.

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

Для этих упражнений я буду использовать Xubuntu Linux 16.04.3 LTS (Xenial Xerus) и MySQL 5.7.21.

До скорости

Недавно я опубликовал серию из двух частей, посвященных триггерам MySQL для конкретного случая использования проверки целостности данных. В Части 1 подробно описана конечная цель, стоящая за спусковым крючком, в то время как Часть 2 сосредоточена на самом TRIGGER и его работе. Посетите эти сообщения, чтобы быстрее ознакомиться с набором данных и таблицами, упомянутыми в этом сообщении в блоге.

Примечание: я хочу упомянуть эти два замечательных видеоролика MySQL Youtube о курсорах. На канале в целом собраны одни из лучших видеороликов о MySQL. После просмотра обоих этих видео и применения того, чему я научился в своих целях / учебе, родился этот пост в блоге.
Посетите их оба по предоставленным ссылкам и наслаждайтесь. Они хорошо структурированы и очень информативны.

Предположим, вам поручено проверить какие-либо записи в flagged_asset таблице.
Вот описание таблицы:

В этой таблице хранятся записи, которые нуждаются в некоторой проверке перед окончательным хранением в «производственных» таблицах.
Потенциально мониторинг этой таблицы - задача, которую можно выполнять ежедневно.

Конечно, мы можем легко запустить SELECT запросов к таблице, например:

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

И вот идеальное применение такой штуке.

Пример хранимой процедуры

Давайте посмотрим на пример хранимой процедуры, которую мы можем применить для этого варианта использования.
Код хранимой процедуры asbuilt.proc_flagged_asset показан ниже:

Чтобы получать уведомления о последнем посте от Digital Owl's Prose по электронной почте, подпишитесь, нажав кнопку Нажмите, чтобы подписаться! На боковой панели на главной странице!
Обязательно посетите « Best Of » Страница с коллекцией моих лучших сообщений в блоге, пока вы там!

CURSOR будет перемещаться по таблице строка за строкой, возвращая все записи при вызове процедуры.
Давайте приступим к действию.

Оператор CALL вызывает процедуру.

Уведомление в строке 2, CREATE PROCEDURE asbuilt.proc_flagged_notify(). Указывая префикс базы данных asbuilt для имени, мы гарантируем, что эта процедура доступна только в указанной базе данных. Поскольку набор результатов применим к таблице flagged_asset, я считаю, что это лучше, чем делать его доступным (процедуру) в базе данных по умолчанию.

CREATE PROCEDURE proc_flagged_notify()
работает без ошибок.

А курсоры вы упомянули?

Вот три важных аспекта, касающихся CURSOR ', о которых вам следует знать, они приведены непосредственно из документации MySQL в разделе 13.6.6.

  • Бесчувственный: сервер может или не может делать копию своей таблицы результатов.
  • Только чтение: не обновляется
  • Не прокручивается: можно перемещаться только в одном направлении и нельзя пропускать строки.

Делая выводы из вышеизложенного, мы знаем, что CURSOR просто возвращают нам набор результатов (если есть) и не предназначены для обновления.

CURSOR 'перемещается по всему набору результатов и возвращает все, что там найдено, по порядку. Если вам нужно что-то более настраиваемое, с возможностью пропускать строки, другие альтернативы могут быть лучшим выбором.

Понимание этой процедуры

Давайте изучим asbuilt.proc_flagged_asset процедуру построчно и определим, как она работает.

  • Строки 1 и 24 устанавливают DELIMITER для использования в теле процедуры. Поскольку у нас есть несколько операторов и мы хотим использовать точку с запятой по умолчанию (;), мы должны временно изменить ее.
  • Строка 2: Команда CREATE PROCEDURE отвечает за создание и имя процедуры proc_flagged_notify.
  • Строки 4–9: Здесь у нас есть несколько DECLARE операторов, определяющих переменные для использования с CURSOR, расположенным в строке 11. В основном, значения столбцов, возвращенные из запроса SELECT, хранятся в них.
  • Строка 10 содержит объявление для переменной v_finished, которая используется в тестовом примере для CONTINUE HANDLER, объявленного в строке 13. Подобная функциональность исключительно продемонстрирована в вышеупомянутых видеороликах YouTube вместе с официальной документацией MySQL (ссылка прилагается в разделе «Заключение»).
  • Строка 11: SELECT все столбцы из flagged_asset таблицы в переменную, объявленную в строках 4–9, как упомянуто выше. Затем все возвращенные столбцы помещаются в CURSOR v_cur.
  • Строка 13, на мой взгляд, самая интересная. CONTINUE HANDLER указывает, что при возникновении условия NOT FOUND мы будем SET значение v_finished равным 1. Это условие возникает, когда не остается строк для перемещения. Зачем это делать? Продолжить чтение.
  • Мы должны открыть CURSOR, чтобы использовать его. В сети 14.
  • Строка 15: Здесь мы называем и начинаем LOOP, get_flagged.
  • Строка 16: Теперь объявленные переменные из строк 4–9 загружены значениями из нашего v_cur CURSOR.
  • Строка 17: это логическое выражение является ключевым для переменных, загружаемых со всеми строками таблицы. Пока переменная v_finished не станет равной 1, LOOP продолжается.
  • После получения значения "истина" get_flagged LOOP завершает работу в строке 18.
  • Строка 20: Мы SELECT все загрузили переменные из курсора.
  • LOOP завершается и заканчивается в строке 21.
  • Строка 22: Мы должны закрыть v_cur CURSOR, чтобы освободить ресурсы. CURSOR автоматически закрывается в конце BEGIN/END блока. Однако обычно рекомендуется закрывать их явно.
  • Строка 23 заканчивается и создает процедуру с $$ DELIMITER.
  • Строка 24 сбрасывает DELIMITER обратно на точку с запятой по умолчанию (;).

Информационные биты

Я нашел нижеприведенные пункты информативными из моих исследований курсоров в документации и хочу поделиться ими с вами.

  • Объявите курсоры после переменных и перед обработчиками.
  • CURSOR закрывается в конце блока BEGIN/END.
  • Объявите CURSOR для извлечения строк из связанного оператора SELECT, который не содержит предложение INTO.
  • Используйте FETCH для получения строк, обработанных CURSOR. Примечание. Количество столбцов, извлеченных соответствующим оператором SELECT для CURSOR, должно соответствовать количеству столбцов, извлеченных FETCH.

Курсоры классные

Написание этого сообщения в блоге позволило мне узнать и поделиться полезными концепциями курсоров. Какие из ваших любимых применений курсоров в хранимых процедурах? Я также хотел бы узнать о них и улучшить свои навыки работы с MySQL. До следующего раза, спасибо за чтение.

Призыв к действию!

Спасибо, что нашли время прочитать этот пост. Я искренне надеюсь, что вы открыли для себя что-то интересное и поучительное. Пожалуйста, поделитесь своими выводами здесь с кем-нибудь, кого вы знаете, кто тоже получит от этого такую ​​же ценность.
Посетите страницу« Портфолио-проекты , чтобы увидеть запись в блоге / техническую документацию, которую я написал для клиентов.

Я уже упоминал, как я люблю чашку кофе?!?!

Чтобы получать уведомления о последнем посте от Digital Owl's Prose по электронной почте, подпишитесь, нажав кнопку Нажмите, чтобы подписаться! На боковой панели на главной странице!
Обязательно посетите « Best Of » Страница с коллекцией моих лучших сообщений в блоге, пока вы там!

Джош Отвелл хочет учиться и расти как разработчик SQL и блогер. Другие любимые занятия находят его, уткнувшись носом в хорошую книгу, статью или командную строку Linux. Среди них он разделяет любовь к настольным ролевым играм, чтению фэнтезийных романов и проведению времени с женой и двумя дочерьми.

Отказ от ответственности: примеры, представленные в этом посте, представляют собой гипотетические идеи о том, как достичь аналогичных результатов. Это не самое лучшее решение. Ваши конкретные цели и потребности могут отличаться. Используйте те методы, которые лучше всего подходят для ваших нужд и целей. Мнения мои собственные.

Первоначально опубликовано на joshuaotwell.com 12 марта 2018 г.

✉️ Подпишитесь на рассылку еженедельно Email Blast от CodeBurst 🐦 Подпишитесь на CodeBurst на Twitter , просмотрите 🗺️ Дорожная карта веб-разработчиков на 2018 год и 🕸️ Изучите веб-разработку с полным стеком .