![]() Интернет, компьютеры, софт и прочий Hi-Tech | ||||||||||||||||
Избранные докиМетки (все метки)hi tech, internet, it, software, интернет, информационные технологии, ит, по, программное обеспечение, софт
Подписаться через RSS2Email.ru
|
Курсоры в хранимых процедурах MySQL. Часть 3Тэйлор Рен (Taylor Ren), 05.02.2014 Возврат набора данных хранимой процедуройНемного подробнее рассмотрим то, как возвращать набор данных из ХП, если он создается как последовательность данных, получаемых в результате нескольких вызовов другой ХП. Наша ранее созданная ХП возвращает полосу побед/поражений всего за один год. Но пользователь может захотеть узнать больше. Поэтому нам следует вывести табличку с полосами побед/поражений за все годы в следующей форме:
(Разумеется, лучше выводить самые длинные полосы побед и поражений в соответствующем сезоне. Чтобы этого добиться, мы можем легко расширить предыдущую ХП, но я оставлю ее реализацию для интересующихся. Для целей этой статьи нам достаточно получать последние цепочки побед/поражений.) ХП в MySQL могут возвращать только скалярные результаты
(числа, строки и т.п.). Они не могут вернуть результат выполнения запроса Чтобы сделать это, воспользуемся временной таблицей или (если это можно и нужно) избыточной таблицей. Давайте посмотрим, как добиться нужного результата с помощью временной таблицы. Сначала создадим вторую ХП, как показано ниже: DELIMITER $$ CREATE DEFINER=`root`@`%` PROCEDURE `yearly_streak`() begin declare cur_year, max_year, min_year int; select max(year), min(year) from lakers into max_year, min_year; DROP TEMPORARY TABLE IF EXISTS yearly_streak; CREATE TEMPORARY TABLE yearly_streak (season int, streak int, win char(1)); set cur_year=max_year; year_loop: loop if cur_year<min_year then leave year_loop; end if; call streak(cur_year, @l, @s); insert into yearly_streak values (cur_year, @l, @s); set cur_year=cur_year-1; end loop; select * from yearly_streak; DROP TEMPORARY TABLE IF EXISTS yearly_streak; END Обратим внимание на несколько ключевых моментов:
Для получения нужного результата мы создадим еще один небольшой скрипт PHP, как показано ниже: <?php ... // Здесь получаем параметры коннекта к БД $cn=new PDO($dsn, $user, $pass); $res=$cn->query('call yearly_streak')->fetchAll(); foreach ($res as $r) { echo sprintf("В %d году длиннейшая череда W/L составила %d %s", $r['season'], $r['streak'], $r['win']); } Этот код выведет что-то вроде следующего:
Пожалуйста заметьте, что приведенный код немного отличается от вызова нашей первой ХП. Первая ХП возвращает не набор данных, а лишь два параметра. В этом случае мы используем в PDO сначала
Вуаля! Мы сделали это! ВыводыВ этой статье мы углубились в хранимые процедуры MySQL,
рассмотрели функциональность курсоров. Мы продемонстрировали, как получать скалярные данные с помощью параметров вывода
(заданных как Официальная документация по синтаксису хранимых процедур и других выражений может быть найдена на сайте MySQL. При создании хранимых процедур, пожалуйста, руководствуйтесь этим документом, а для лучшего понимания синтаксиса, прочтите также этот. Не стесняйтесь комментировать и высказывать свои мысли! Автор: Тэйлор Рен, 05.02.2014 Тэйлор РенТэйлор — свободный разработчик веб- и десктопных приложений, проживающий в Сужоу в восточном Китае. Начинал со средств разработки Borland (C++Builder, Delphi), опубликовал книгу по InterBase. С 2003 является сертифицированным экспертом Borland. Затем переключился на веб-разработку в типичной конфигурации LAMP. Позднее начал работать с jQuery, Symfony, Bootstrap, Dart и т.д. Предыдущие публикации: Последнее редактирование: 2014-03-26 05:13:57 Метки материала: процедуры, курсоры, хранимые процедуры, mysql, хранимки, процедуры mysql, cursor, sql, бд, хранимые процедуры mysql, db, хп, procedure Оставьте, пожалуйста, свой комментарий к публикации |
© 2007-2019, Дмитрий Скоробогатов.
Разрешается воспроизводить, распространять и/или изменять материалы сайта
в соответствии с условиями GNU Free Documentation License,
версии 1.2 или любой более поздней версии, опубликованной FSF,
если только иное не указано в самих материалах.