Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Диго С.М. Базы данных проектирование и использование.doc
Скачиваний:
720
Добавлен:
14.05.2016
Размер:
12.04 Mб
Скачать

7.8.4. Курсоры

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

Курсор определяется посредством оператора объявления курсора (DECLARE CURSOR). Этот оператор определяет имя курсора, а так же содержит в своем составе запрос, выходные данные которого сохраняются для последующей обработки включающей программой:

DECLARE <имя_курсора> [INSENSITIVE] [SCROLL] CURSOR

FOR <подзапрос> [<предложение для обновления>]

Курсор находится либо в открытом состоянии, либо в закрытом. Начальное состояние курсора - закрытое. Для открытия курсора ис­пользуется оператор OPEN CURSOR <имя курсора>. Запрос, описанный при определении курсора, выполняется именно при откры­тии курсора. При первом открытии курсор устанавливается перед первой строкой. Позиция курсора в открытом состоянии может быть перед определенной строкой, на определенной строке или после пос­ледней строки. Если курсор установлен на строку, то эта строка явля­ется текущей строкой курсора.

Для построчного извлечения данных из курсора используется опе­ратор FETCH. Этот оператор продвигает позицию открытого курсора на следующую строку в порядке этого курсора, извлекает значения полей этой строки в переменные и имеет следующий синтаксис:

FETCH [[orientation]FROM] имя курсора

INTO целевая спецификация.,..;

orientation::=

NEXT | PRIOR | FIRST | LAST | {ABSOLUTE | RELATIVE

спецификация значения}

Значения NEXT, PRIOR, FIRST, LAST понятны без дополнитель­ного пояснения. Значение ABSOLUTE N вызывает перемещение на N-ю строку, а значение RELATIVE N - перемещение на N строк впе­ред, если N - положительное число, и на N строк назад, если N -отрицательное число.

Если задано предложение INSENSITIVE (нечувствительный), то, пока курсор открыт, все изменения над данными курсора будут игно­рироваться.

Строки открытого курсора имеют определенный порядок. Для того чтобы установить нужный порядок, можно использовать в операторе SELECT предложение ORDER BY. В противном случае порядок ус­танавливается реализацией.

Если задано предложение SCROLL, то не обязательно извлекать строки в том порядке, который задан при открытии.

Курсоры могут быть двух типов: обновляемые и только для чте­ния. Чтобы курсор был обновляемым, он должен базироваться на од­ной и только одной таблице, не содержать предложения ORDER BY, не объявляться как INSENSITIVE или SCROLL.

Курсор возвращается в закрытое состояние посредством исполь­зования оператора закрытия курсора CLOSE <имя курсора.>

7.9. Ms Jet Access sql

Поскольку, несмотря на наличие стандартов, реализация языка в каждой СУБД имеет специфические особенности, а работать прихо­дится в конкретной среде, то примеры на использование SQL необхо­димо рассматривать в реальных системах. В связи с широким исполь­зованием в настоящее время СУБД Access рассмотрим реализацию SQL на примере этой системы.

Microsoft Access SQL в основном отвечает стандарту ANSI-89 (уро­вень 1). Однако некоторые средства ANSI SQL не применяются в Microsoft Access SQL. И наоборот, Microsoft Access SQL использует зарезервированные слова и средства, не поддерживаемые ANSI SQL.

Кроме того, в Access 2000 имеется режим ANSI SQL-92. Этот ре­жим учитывает расширенный синтаксис SQL и обеспечивает боль­шую совместимость с SQL-92 и Microsoft® SQL Server™. Этот ре­жим доступен только в случае использования программы Microsoft OLE DB Provider для Jet. Новые средства относятся преимуществен­но к языку определения данных (DDL).

В качестве построителя запросов на SQL можно использовать таб­личный язык запросов QBE. Но не все типы запросов SQL могут быть реализованы на QBE. В Access такие типы запросов, как запросы к серверу, управляющие запросы (т.е. запросы, которые корректируют содержимое таблиц) и запросы на объединение, не могут быть опре­делены в бланке запроса. Для создания таких запросов требуется вве­сти оператор SQL непосредственно в окно запроса в режиме SQL.