Курсоры 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, как упомянуто выше. Затем все возвращенные столбцы помещаются вCURSORv_cur. - Строка 13, на мой взгляд, самая интересная.
CONTINUE HANDLERуказывает, что при возникновении условияNOT FOUNDмы будемSETзначениеv_finishedравным 1. Это условие возникает, когда не остается строк для перемещения. Зачем это делать? Продолжить чтение. - Мы должны открыть
CURSOR, чтобы использовать его. В сети 14. - Строка 15: Здесь мы называем и начинаем
LOOP,get_flagged. - Строка 16: Теперь объявленные переменные из строк 4–9 загружены значениями из нашего
v_curCURSOR. - Строка 17: это логическое выражение является ключевым для переменных, загружаемых со всеми строками таблицы. Пока переменная
v_finishedне станет равной 1,LOOPпродолжается. - После получения значения "истина"
get_flaggedLOOPзавершает работу в строке 18. - Строка 20: Мы
SELECTвсе загрузили переменные из курсора. LOOPзавершается и заканчивается в строке 21.- Строка 22: Мы должны закрыть
v_curCURSOR, чтобы освободить ресурсы.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 год и 🕸️ Изучите веб-разработку с полным стеком .