Интернет, компьютеры, софт и прочий Hi-Tech

Подписаться через RSS2Email.ru

Курсоры в хранимых процедурах MySQL

Тэйлор Рен (Taylor Ren), 05.02.2014

часть 1 | часть 2 | часть 3

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

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

Что такое курсор (CURSOR)?

Курсоры не могут использоваться в MySQL сами по себе. Они — неотъемлемые компоненты хранимых процедур. Я считаю курсоры аналогами «указателей» в C/C++, или итератора в PHP, используемого в цикле foreach.

С помощью курсоров мы можем обойти весь набор данных и над каждой записью произвести действия, требуемые определенной задачей. Такие операции над записями могут производиться и на стороне PHP, но если мы хотим уменьшить объем передаваемых данных, мы можем просто получить в PHP уже готовые обобщенные/статистические данные. Становится ненужным производить манипуляцию selectforeach на клиентской стороне.

Поскольку курсоры реализуются в хранимых процедурах, им присущи все достоинства (и недостатки) ХП (контроль доступа, прекомпилируемость, сложность отладки и т.д.).

Официальная документация по курсорам расположена здесь. Она содержит всего четыре команды. А именно: объявление курсора, его открытие, закрытие и выборка из него. Как было сказано выше, в этой статье мы затронем также и другие выражения в хранимых процедурах. Давайте начнем.

Пример из практики

На моем персональном сайте есть страница, на которой выводится счет моей любимой команды НБА: ЛА Лейкерс. Соответствующая ей таблица имеет простую структуру:

Структура таблицы lakers

Рисунок 1. Структура таблицы матчей Лейкерс

Я пополняю эту таблицу с 2008 года. Вот несколько последних записей о Лейкерс за сезон 2013-14:

Данные таблицы lakers

Рисунок 2. Данные таблицы матчей Лейкерс (часть) за сезон 2013-2014

(В качестве графического средства для управления моими базами MySQL я использую MySQL Workbench. Вы можете использовать свою любимую программу.)

Итак, я признаю, что Лейкерс не очень хорошо играли в эти дни. 6 поражений подряд к 15 января. Я понял, что они «проиграли 6 раз подряд» вручную посчитав строки с буквой «L» (означающей поражение) в столбце winlose для последних сыгранных матчей. Так можно делать, но в случае более запутанной и большой таблицы это может занять порядочно времени и чревато ошибками.

Можем мы сделать это единственным SQL-запросом? Я не являюсь экспертом в SQL и не могу представить себе, как добиться требуемого результата («проиграли 6 раз подряд») с помощью одного SQL-запроса. Мне было бы ценно мнение гуру по этому вопросу — оставьте свой комментарий ниже.

Можем мы сделать это в PHP? Да, конечно. Мы можем получить данные по играм (из столбца winlose) для нужного сезона, а затем обойти все записи для вычисления самой длинной череды побед/поражений. Но чтобы это сделать, мы должны получить все данные за этот год, большинство из которых будут бесполезны, так как невероятно, чтобы команда выиграла или проиграла свыше 20 игр подряд в обычном сезоне на 82 игры. Мы не знаем, сколько записей нужно получить в PHP для определения нужной череды, так что многие из них будут бесполезны. А если текущая череда побед/поражений — это единственное, что нам нужно, зачем запрашивать все данные?

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

Итак, как лучше это сделать?

часть 1 | часть 2 | часть 3

Автор: Тэйлор Рен, 05.02.2014
Перевод с английского: Дмитрий Скоробогатов, специально для xBB.uz, 19.03.2014
Оригинальный текст может быть найден по адресу http://www.sitepoint.com/cursors-mysql-stored-procedures/

Тэйлор Рен

Тэйлор — свободный разработчик веб- и десктопных приложений, проживающий в Сужоу в восточном Китае. Начинал со средств разработки Borland (C++Builder, Delphi), опубликовал книгу по InterBase. С 2003 является сертифицированным экспертом Borland. Затем переключился на веб-разработку в типичной конфигурации LAMP. Позднее начал работать с jQuery, Symfony, Bootstrap, Dart и т.д.


Предыдущие публикации:

Биржа долевых инвестиций SIMEX.

Последнее редактирование: 2014-03-19 04:37:03

Метки материала: процедуры, курсоры, хранимые процедуры, mysql, хранимки, процедуры mysql, cursor, sql, бд, хранимые процедуры mysql, db, хп, procedure

Оставьте, пожалуйста, свой комментарий к публикации

Представиться как     Антибот:
   

Просьба не постить мусор. Если вы хотите потестить xBB, воспользуйтесь кнопкой предварительного просмотра на панели инструментов xBBEditor-а.


© 2007-2017, Дмитрий Скоробогатов.
Разрешается воспроизводить, распространять и/или изменять материалы сайта
в соответствии с условиями GNU Free Documentation License,
версии 1.2 или любой более поздней версии, опубликованной FSF,
если только иное не указано в самих материалах.