
- •1. Конспект лекций (семестр 5)
- •1.1. Введение в базы данных
- •1.2. Классификация моделей данных
- •1.3. Язык sql
- •1.4. Проектирование баз данных
- •1.5.Физические модели баз данных
- •1.6. Распределённая обработка данных
- •1.7. Обеспечение безопасности в бд
- •1.8. Современные направления исследований и разработок
- •1.9. Методы и модели анализа данных: olap и Data Mining
- •2. Конспект лекций (семестр 6)
- •2.1. Представления
- •2.2. Компоненты языка Transact-sql
- •2.3. Курсоры
- •2.4. Хранимые процедуры
- •2.5. Триггеры
- •3. Рекомендуемая литература
2.3. Курсоры
Одним из характерных свойств реляционных баз данных является то, что действия выполняются над множествами строк. Курсор представляет собой объект, который указывает на определённую строку во множестве. Множество строк, на которое указывает курсор, определяется с помощью команды SELECT.
Существуют два типа курсоров: курсоры Transact SQL и курсоры API (курсоры программного интерфейса приложения). Мы будем изучать курсоры Transact SQL.
Курсоры создаются с помощью команды DECLARE CURSOR. Рассмотрим три основные характеристики курсоров:
способность отражать изменения в исходных данных (чувствительность),
способность осуществлять прокрутку во множестве строк (как вперёд, так и назад или только вперёд),
способность модифицировать множество строк (возможность обновления строк или «только для чтения»).
Transact SQL поддерживает 4 типа курсоров:
статические. Делается как бы моментальный снимок данных, задаваемых оператором SELECT, которые хранятся в базе данных tempdb. Такие курсоры «не чувствуют» изменений в структуре или в значениях данных.
ключевые. В базу данных tempdb копируются только те столбцы, которые уникально идентифицируют каждую строку.
динамические. Они ведут себя так, как если бы при каждом обращении к строке повторно выполнялся оператор SELECT.
курсоры быстрого доступа или «пожарные». Это специальная оптимизированная форма непрокручиваемого курсора, допускающая только чтение.
Последовательность операций с курсором
1. Создание курсора. Это напоминает предварительное объявление переменной перед её использованием.
DECLARE cursor_name [INSENSITIVE] [SCROLL] CURSOR
FOR select_statement
[FOR {READ ONLY | UPDATE [OF column_list]}]
cursor_name - имя курсора.
INSENSITIVE – признак статического курсора. Изменения данных не разрешаются. Если ключевое слово INSENSITIVE не задано, по умолчанию создаётся динамический курсор.
SCROLL – прокрутка. Если данный параметр опускается, то курсор будет последовательным, т.е. его просмотр возможен только в одном направлении – от начала к концу.
select_statement – определяет тело запроса SELECT, с помощью которого задаётся набор строк курсора.
FOR READ ONLY – курсор «только для чтения»
FOR UPDATE [OF column_list [,…n]] – возможность изменения данных с помощью курсора в исходных таблицах. column_list [,…n] указывает список изменяемых столбцов.
Например: DECLARE auth_curs CURSOR
FOR SELECT * FROM authors или
DECLARE myCursor CURSOR
FOR SELECT OilName FROM Oils
DECLARE @ myCursorVariable CURSOR
SET @ myCursorVariable = myCursor
Можно сначала объявить курсорную переменную, а затем использовать её для создания курсора, например:
DECLARE @ myCursorVariable CURSOR
SET @ myCursorVariable CURSOR
LOCAL FAST_FORWARD FOR SELECT OilName FROM Oils
Открытие курсора. Объявление курсора создаёт объект курсора, но не создаёт набор записей. Для этого нужно открыть курсор.
OPEN [GLOBAL] cursor_name} | cursor_variable_name
Выборка из курсора (считывание данных). После открытия курсора из него можно считывать данные с помощью команды FETCH. SQL Server 2000 позволяет считывать из курсора всего одну строку.
FETCH [ [ NEXT | PRIOR | FIRST | LAST | ABSOLUTE { n | @nvar } | RELATIVE { n | @nvar } ] FROM ] { { [ GLOBAL ] cursor _name } | @ cursor _variable_name } [ INTO @variable_name [ ,...n ] ]
NEXT | PRIOR | FIRST | LAST – возвращается следующая, предыдущая, первая или последняя строка результирующего набора курсора. Эта строка становится текущей.
ABSOLUTE – возвращает строку по её абсолютному порядковому номеру.
RELATIVE – возвращает строку, находящуюся через n строк после текущей.
{ { [ GLOBAL ] cursor _name } | @ cursor _variable_name } – определяет имя курсора, из которого необходимо выбрать данные.
INTO @variable_name [ ,...n ] – задаёт список переменных, в которых будут сохранены соответствующие значения полей возвращаемой строки.
Например:
DECLARE simpleCursor CURSOR
LOCAL KEYSET
FOR SELECT OilName FROM Oils
DECLARE @theName char (20)
OPEN simpleCursor
-- Retrieve the first row into a variable
FETCH FIRST FROM simpleCursor INTO @theName
-- Retrieve the fifth row
FETCH ABSOLUTE 5 FROM simpleCursor INTO @theName
CLOSE simpleCursor
DEALLOCATE simpleCursor
Закрытие курсора. Закончив использовать курсор, вы должны его закрыть. Оператор CLOSE освобождает ресурсы, выделенные под курсор.
CLOSE [GLOBAL] cursor_name} | cursor_variable_name
Освобождение курсора. Оператор DEALLOCATE удаляет идентификатор или курсорную переменную, но не обязательно удаляет сам курсор.
DEALLOCATE [GLOBAL] cursor_name} | cursor_variable_name
Модификация и удаление строк через курсоры
Если ваш курсор модифицируемый, т.е. описан как FOR UPDATE, изменение исходных значений во множестве курсора выполняется достаточно просто. Модификация через курсор осуществляется через фразу WHERE. Это называется позиционное обновление:
UPDATE таблица_или_представление
SET список_для_модификации
WHERE CURRENT OF курсор_или_переменная
Transact-SQL также поддерживает позиционное удаление, которое имеет следующую форму записи:
DELETE таблица_или_представление
WHERE CURRENT OF курсор_или_переменная
Мониторинг курсоров Transact-SQL
В Transact-SQL существует две глобальные переменные и функция, которые помогают контролировать работу и состояние вашего курсора. Переменная @@CURSOR_ROWS возвращает количество строк во множестве последнего курсора. Переменная @@FETCH_STATUS возвращает информацию о выполнении последней команды FETCH.
Функция CURSOR_STATUS (тип, курсор_или_переменная) возвращает значение о состоянии курсора. Более подробную информацию см. в документации по SQL Server.