Программирование >>  Sql: полное руководство 

1 ... 142 143 144 [ 145 ] 146 147 148 ... 264


DECLARE имя набора записей CURSOR FOR запрос на выборку -щ

Рис. 17.24. Синюксичеаеая диаграЩа инсгрукции DECLARE CORSOR

Инструкция select в инструкции declare cursor Определяет запрос, связанный с набором записей. Она может быть любой допустимой интерактивной инструкцией select, описанной в главах 6-9. В частности, эта инструкция должна содержать предложение from и может содержать предложения where, group by, having и order by. Инструкция select может также включать операцию union, описанную в главе 6. Таким образом, во встроенных запросах SQL можно использовать все возможности, предоставляемые интерактивным SQL.

Запрос в инструкции declare cursor может содержать входные базовые переменные. Они выполняют ту же функцию, что и во встроенных инструкциях Insert, delete, update, а также в одиночной инструкции select. Входная базовая переменная в запросе может стоять везде, где может стоять константа. Обратите внимание на то, что выходные базовые переменные не могут использоваться в этом запросе. В отличие от одшючной инструкции select, инструкция select, помещенная внутри инструкции declare cursor, нс содержит предложения into и самостоятельно не извлекает данные. Предложение into является частью инструкции fetch, которая рассматривается ниже в настоящей главе.

Как следует из названия, инструкция declare cursor представляет собой объявление набора записей. В большинстве СУБД, включая СУБД компании IBM, эта инструкция является директивой препроцессора SQL; она не является исполняемой инструкцией и препроцессор не создает для нее объектный код. Как и все объявления, инструкция declare cursor должна располагаться в программе перед любыми инструкциями, которые содержат ссылки на объявляемый ею набор записей. В большинстве СУБД имя набора записей используется как глобальное имя, на которое можно ссылаться в любых процедурах, функциях или подпрограммах, расположенных после инструкции declare cursor.

Стоит отметить, что не во всех СУБД инструкция declare cursor трактуется строго как инструкция, только объявляющая набор записей, и это может приводить к проблемам, которые трудно предвидеть. Некоторые препроцессоры SQL для инструкции declare cursor генерируют объектный код (или объявления базового языка, или вызовы СУБД, или то и другое), придавая ей некоторые качества исполняемой инструкции. Для этих препроцессоров инструкция declare cursor должна не только физически предшествовать инструкциям open, fetch и close, которые ссылаются на данный набор записей, но и вьшолняться перед ними или же находиться с ними в одном блоке.

Проблем с инструкцией declare cursor можно избежать, придерживаясь следующих правил:

Располагайте инструкцию declare cursor для данного набора записей прямо перед инструкцией open. Это обеспечивает правильную физическую последовательность инструкций, размещение инструкций declare cursor и open в одном блоке и вьшолнение инструкции declare cursor (в случае необходимости) ранее инструкции open.

Убедитесь, что инструкции fetch и close для данного набора записей следуют за инструкцией open как физически, так и по ходу выполнения программы.



Инструкция OPEN

Можно сказать, что инструкция open, синтаксическая диаграмма которой изображена на рис. 17.25, открывает таблицу результатов запроса для прикладной программы. На практике инструкция open дает СУБД команду выполнить запрос или, по крайней мере, начать его выполнение. Таким образом, инструкция open заставляет СУБД выполнить ту же работу, которую вынуждает ее выполнить интерактивная инструкция select, и остановиться непосредственно перед получением первой строки результатов запроса.

-open имя на6ора записей

using-т- базовая переменная

Рис. 17.25j СинтаксическаятаммарндрукциирРЕЫ

Единственным параметром инструкции open является имя набора записей, который должен быть открыт. Этот набор записей необходимо предварительно объявить с помощью инструкции declare cursor. Если при выполнении запроса, связанного с набором записей, происходит ошибка, инструкция open присваивает отрицательное значение переменной sqlcode. Именно инструкция open вьщает сообщения о большинстве ошибок, возникающих во время выполнения запроса, таких как ссылка на неизвестную таблицу, неоднозначное имя столбца или попытка извлечь данные из таблицы без соответствующего разрешения. Во время выполнения последующих инструкций fetch обычно происходит очень мало ошибок.

Будучи однажды открытым, набор записей остается в таком состоянии до его закрытия с помощью инструкции close. СУБД автоматически закрывает все открытые наборы записей в конце транзакции (т.е. когда СУБД выполняет инструкцию commit или rollback). После того как набор записей был закрыт, его можно вновь открьпь, выполнив инструкцию open повторно. Обратите внимание: каждый раз, когда СУБД выполняет инструкцию open, она запускает запрос с нуля (с самого начала).

Инструкция FETCH

Инструкция fetch, синтаксическая диаграмма которой изображена на рис. 17.26, передает в прикладную программу следующую строку результатов запроса. Указатель набора записей, заданного в инструкции fetch, определяет, какая строка результатов запроса должна быть извлечена. Этот набор записей должен быть предварительно открыт с помощью инструкции open.

\- fetch имя набора записей into - базовая переменная -,-

Рис. 17.26. Синтаксическая unarpaMUiO инструкции FETCH

Инструкция fetch записывает строку данных в базовые переменные, указанные в предложении into данной инструкции. Для обеспечения корректного извлечения



значений null каждой базовой переменной может сопутствовать переменная-индикатор. Свойства переменной-индикатора и значения, которые она может принимать идентичны описанным выше для одиночной инструкции select. Число базовых переменных должно быть равно числу столбцов в таблице результатов запроса, а типы данных базовых переменных должны быть совместимыми с типами данных соответ-ствуюших столбцов из таблицы результатов запроса.

Как видно из рис. 17.27, инструкция fetch обеспечивает перемешение указателя набора записей по таблице результатов запроса от строки к строке в соответствии со следуюшими правилами:

Инструкция open устанавливает указатель набора записей в положение, предшествующее первой строке таблицы результатов запроса. В этом положении у набора записей нет текущей строки.

Инструкция fetch продвигает указатель набора записей на следующую доступную строку таблицы результатов запроса, если таковая имеется. Данная строка становится текущей строкой набора записей.

Если инструкция fetch продвигает указатель набора записей в положение, следующее за последней строкой таблицы результатов запроса, то эта инструкция возвращает предупреждение not found. В данной ситуации у набора записей опять нет текущей строки.

Инструкция close прекращает доступ к таблице результатов запроса и закрывает набор записей.


Результаты запроса (три строки)

MFR ID

PRODUCT ID

DESCRIPTION

(NOT FOUND)

Рис. 17.27. Позиционирование указателя набора записей с помощью инструкций OPEN, FETCH и CLOSE

Если извлеченные строки отсутствуют (таблица результатов запроса пустая), то инструкция open все равно устанавливает указатель набора записей перед таблицей результатов запроса и успешно завершается. Программа не может обнаружить, что инструкция open извлекла пустую таблицу результатов запроса. Однако первая же инструкция fetch возвращает предупреждение not found и устанавливает указатель набора записей за последней строкой таблицы результатов запроса.



1 ... 142 143 144 [ 145 ] 146 147 148 ... 264

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика