Студопедия

КАТЕГОРИИ:


Архитектура-(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, в которой названия элементов каталога будут представлены в верхнем регистре.

 

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

 

  1. При помощи инструкции declare cursor имя курсора связывается с выполняемым запросом.
  2. Оператор open выполняет запрос, связанный с курсором, и устанавливает курсор перед первой записью результирующей таблицы.
  3. Оператор fetch помещает курсор на первую запись результирующей таблицы и извлекает данные из записи в локальные переменные хранимой процедуры. Повторный вызов оператора fetch приводит к перемещению курсора к следующей записи, и так до тех пор, пока записи в результирующей таблице не будет исчерпаны. Эту операцию удобно осуществлять в цикле.

 

Замечание! Работа с курсорами похожа на работу с файлами – сначала происходит открытие курсора, затем чтение и после закрытие.

 

Оператор 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; Просмотров: 462; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.008 сек.