Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие.doc
Скачиваний:
57
Добавлен:
14.05.2015
Размер:
1.51 Mб
Скачать

2. Выборка данных из курсора

После объявления курсор нужно открыть, т.е. за операто­ром DECLARE должен следовать оператор OPEN, имеющий следующий синтаксис:

OPEN [Global] имя_курсора

Пример:

OPEN pub_crsr

Из открытого курсора можно прочитать данные по­строчно. В SQL Server предусмотрены курсоры с прокруткой вперёд (forward_scrolling cursor) и с прокруткой назад (back­ward_scrolling cursor) .

Синтаксис оператора FETCH:

FETCH[INEXT | PRIOR | FIRST | LAST | ABSOLUTEn | RELA­TIVEn]

FROM [GLOBAL] имя_курсора

[INTO@ имя_переменной1, @ имя_переменной2,…]

Элементы синтаксиса:

NEXT – считывает следующую строку;

PRIOR - считывает предыдущую строку;

FIRST – считывает первую строку;

LAST – считывает последнюю строку; ABSOLUTEn – считывает строку с указанным абсолютным номером из результирующего набора;

RELATIVEn – считывает строку, номер которой указан относительно текущей позиции внутри результирующего набора;

INTO @имя_переменной1, @имя_переменной2 и т.д. – копирует содержимое столбцов в указанные переменные.

Для ABSOLUTE и RELATIVE величина перемещения в обратном направлении задается с помощью отрицательных чисел, для ABSOLUTE отсчет начинается с последней строки набора за­писей, для RELATIVE - с текущей строки набора.

Примеры:

1) Прочитать следующую строку из результирующего набора:

FETCH NEXT FROM pub_crsr

2) Прочитать строку 5 из результирующего набора:

FETCH ABSOLUTE 5 FROM pub_crsr

3) Скопировать содержимое следующей строки в пере­менные:

FETCH NEXT FROM pub_crsr INTO @ pub_id, @ pub_name

Завершив обработку данных курсора, необходимо закрыть курсор (оператором CLOSE) освободить занимаемые им системные ресурсы (оператором DEALLOCATE), т.к. оператор CLOSE закрывает курсор, но не освобождает используемые им структуры данных. Этот оператор используется, если планируется в дальней­шем повторно открывать курсор. Оператор DEALLOCATE закрывает курсор и освобождает структуры используемых им данных. Кур­соры потребляют значительные системные ресурсы, блокируют данные, занимают оперативные данные. Если эти ресурсы во­время не освободить, может снизиться быстродействие системы в целом.

Синтаксис операторов CLOSE и DEALLOCATE:

CLOSE [GLOBAL] имя_курсора

DEALLOCATE [GLOBAL] имя_курсора

Примеры:

1) Закрыть курсор:

CLOSE pub_crsr

2) Освободить курсор:

DEALLOCATE pub_crsr

3. Операторы и глобальные переменные для работы с курсорами

Помимо считывания информации из курсора можно вы­полнять построчное обновление и удаление содержащихся в нем данных. При модификации курсора соответствующие изменения будут автоматически распространяться на источник данных кур­сора.

Синтаксис операторов UPDATE и DELETE:

UPDATE имя_таблицы

SET имя_столбца1={выражение1 | NULL | (оператор_SELECT)}

[,имя_столбца2={выражение2 | NULL | (оператор_SELECT)}…]

WHERE CURRENT OF имя_курсора

DELETE FROM имя_таблицы

WHERE CURRENT OF имя_курсора

Пример: Обновить столбец pub_name в таблице publishers

UPDATE publishers

SET pub_name=’Cпутник’

WHERE CURRENT OF pub_crsr

Здесь выполнено обновление текущей строки в курсоре.

Пример: Удалить строку в таблице publishers.

DELETE FROM publishers

WHERE CURRENT OF pub_crsr

Здесь удаляется текущая строка в курсоре.

Для контроля за состоянием курсора можно использовать две глобальные переменные @@FETCH_Status и @@Cursor_Rows.

В первой переменной сохраняется состояние последней команды FETCH. Некоторые значения @@FETCH_Status:

0 – успешная выборка;

-1 – неудачное выполнение выборки или попытка прочи­тать данные за пределами результирующего набора;

-2 – выбираемая строка выпадает из набора данных.

Пример использования переменной:

WHILE @@FETCH_Status=0

…выполняем обработку данных курсора.

Во второй переменной сохраняется количество строк в ре­зультирующем наборе курсора, ее используют после открытия курсора.

Возможные значения:

-n – курсор загружается данными, значение означает те­кущее количество строк в результирующем наборе, однако это число увеличивается по мере обработки оператора SELECT;

n – количество строк в результирующем наборе;

- 0 – результирующий набор не содержит строк;

- 1 – динамический тип курсора, поэтому количество запи­сей неизвестно.