Студопедия

КАТЕГОРИИ:


Архитектура-(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)

Динамический SQL




Курсоры

 

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

1. Оператор DECLARE CURSOR определяет выполняемый запрос с помощью оператора SELECT и связывает имя курсора с данным запросом.

2. Оператор OPEN инициирует выполнение запроса.

3. Оператор FETCH позволяет последовательно премещаться по строкам таблицы результатов, извлекая данные в базовые переменные.

4. Оператор CLOSE ликвидирует связь между курсором и таблицей результатов.

Оператор DECLARE CURSOR в большинстве СУБД не является выполняемым и должен располагаться в программе перед любыми операторами, работающими с данным курсором.

Обычно оператор FETCH продвигает курсор на следующую строку таблицы результатов. В стандарте SQL92 появилось понятие прокручиваемого курсора, задаваемого параметром SCROLL при его объявлении. Для прокручиваемого курсора в операторе FETCH задается один из параметров FIRST, LAST, NEXT, PRIOR, ABSOLUTE, RELATIVE, что позволяет извлечь соответственно первую строку результата, последнюю, следующую, предыдущую, с определенным номером, с определенным сдвигом по сравнению с текущей строкой. Прокручиваемые курсоры могут потребовать выполнения большого объема вычислений.

Курсоры могут быть обновляемыми, что задается фразой FOR UPDATE при объявлении курсора. Если одна строка результатов запроса строго соответствует определенной строке таблицы, то в процессе просмотра пользователь может обновить или удалить определенные строки курсора и внести соответствующие изменения в базовую таблицу. Например, оператор

DELETE FROM Anketa WHERE CURRENT OF Cursor_Ank

удалит текущую строку из курсора Cursor_Ank, а затем и соответствующую строку из таблицы Anketa. Использование обновляемых курсоров обычно связано с определенными ограничениями.

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

Концепция, лежащая в основе динамического SQL, проста: встроенный оператор SQL не записывается в исходный текст программы, а формируется в процессе ее выполнения. Рассматривая различия между статическим и динамическим SQL, можно провести аналогию с ранним и поздним связыванием параметров вызова методов в объектно-ориентированном программировании. В статическом SQL запрос готовится к выполнению на стадии компиляции, а в динамическом SQL некоторые процессы переносятся на стадию выполнения программы. Рассмотрим, не вдаваясь в подробности, основные операторы динамического SQL, определенные стандартом SQL92.

Наиболее простой формой динамического SQL является оператор EXECUTE IMMEDIATE (выполнить немедленно). Программа передает на исполнение оператор SQL, сформированный предварительно в виде текстовой строки и не яляющийся запросом на чтение. Оператор EXECUTE IMMEDIATE обеспечивает одноэтапное выполнение динамического оператора.

Если в программе должны выполняться однотипные операторы SQL, можно по команде PREPARE единственный раз произвести синтаксический разбор и оптимизацию оператора. Оператор EXECUTE в этом случае использует проведенную работу и может выполняться многократно с разными параметрами. Этот двухэтапный метод выполнения запроса способствует уменьшению объема вычислений программы.

Операторы EXECUTE IMMEDIATE и EXECUTE не поддерживают динамические запросы на чтение, поскольку у них отсутствует механизм обработки результатов запроса. Для реализации динамических запросов на чтение используется аппарат курсоров. Программа может не знать заранее, с какими таблицами и столбцами оперирует запрос. Оператор DESCRIBE служит для получения из СУБД описания динамического запроса, ранее подготовленного оператором PREPARE. Описание запроса содержится в специальной области СУБД, называемой дескриптором. Как и ранее, выполнение запроса на чтение инициируется при открытии соответствующего курсора оператором OPEN.

 




Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 1213; Нарушение авторских прав?; Мы поможем в написании вашей работы!


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



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




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