![]() КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Курсоры
Если результирующий запрос возвращает одну запись, поместить результаты в промежуточные переменные можно при помощи оператора select…into…from. Однако результирующие таблицы чаще всего содержат несколько записей, и использование такого запроса совместно с оператором select…into…from приводит к возникновению ошибки 1172: “Результат содержит более чем одну строку” (см. пример ниже).
Избежать возникновения ошибки можно, добавив предложение limit 1 или назначив continue -обработчик ошибок. Однако функция будет реализовывать совсем не то поведение, которое ожидает пользователь. Кроме того, существуют ситуации, когда требуется обработать именно многострочную результирующую таблицу.
Например, пусть требуется вернуть записи таблицы catalogs учебной базы данных shop и на основании этих записей создать новую таблицу letter_catalogs, в которой названия элементов каталога будут представлены в верхнем регистре.
Решить эту задачу можно при помощи курсоров, которые позволяют в цикле просмотреть каждую строку результирующей таблицы запросов. Работа с курсорами происходит по следующему алгоритму:
Замечание! Работа с курсорами похожа на работу с файлами – сначала происходит открытие курсора, затем чтение и после закрытие.
Оператор declare cursor объявляет курсор и имеет следующий синтаксис:
DECLARE cursor_name CURSOR FOR select_statement
Оператор объявляет курсор с именем cursor_name для select -запроса select_statement. В рамках хранимой процедуры имя cursor_name должно быть уникальным.
Замечание! В select -запросе select_statement не допускается использовать запрос вида select…into…from.
В момент объявления курсора при помощи оператора declare cursor запрос select_statement не выполняется. Его выполнение откладывается до момента вызова оператора open, который имеет следующий синтаксис:
OPEN cursor_name INTO var, var1, … Оператор fetch принимает имя курсора cursor_name. Далее записи извлекаются при помощи оператора fetch, который имеет следующий синтаксис:
FETCH cursor_name
После ключевого слова into должно быть приведено столько локальных переменных, сколько полей возвращает select -запрос select_statement.
Оператор close имеет синтаксис, схожий с оператором open:
CLOSE cursor_name
Вернемся к поставленной ранее задаче – созданию новой таблицы letter_catalogs с именами элементов каталога в верхнем регистре. Создадим таблицу letter_catalogs при помощи запроса, представленного в примере ниже.
Дата добавления: 2015-05-09; Просмотров: 488; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |