Команда DECLARE CURSOR советы и хитрости SQL Server
Платформа SQL Server поддерживает стандарт ANSI, а также довольно много расширений, которые позволяют гибко управлять тем, как курсор перемещается по результирующему набору и манипулирует данными. Используется следующий синтаксис.
DECLARE имя_курсора [INSENSITIVE] [SCROLL] CURSOR [LOCAL | GLOBAL] [FORWARD_ONLY | SCROLL]
[STATIC | KEYSET | DYNAMIC | FAST_FORWARD] [READ_ONLY | SCROLL, LOCKS | OPTIMISTIC] [TYPE_WARNING]
FOR инструкция_select
[FOR {READ ONLY | UPDATE [OF имя_столбца [, …]]}]
Параметры приводятся ниже.
LOCAL | GLOBAL
Ограничивает область действия курсора либо локальным пакетным заданием Transact-SQL, либо делает курсор доступным для всех пакетных заданий Transact-SQL, запущенных в ходе текущего сеанса инструкциями OPEN и FETCH. На глобальное имя курсора можно ссылаться из любой хранимой процедуры, функции или пакетного задания Transact-SQL, запущенного в текущем сеансе. Глобальный курсор неявно освобождается (deallocate) по завершении сеанса, но локальный курсор необходимо освобождать вручную. Ключевые слова LOCAL и GLOBAL являются необязательными. По умолчанию, если не указано ни одно из них, поведение определяется свойством базы данных default to local.
INSENSITIVE | FORWARDJDNLY | SCROLL
Определяет, как курсор перемещается по результирующему набору. Есть три варианта. INSENSITIVE
Результирующий набор создается в виде таблицы в базе TEMPDB. Изменения, вносимые в базовую таблицу, не отражаются на результирующем наборе данных курсора. Предложение несовместимо с расширениями инструкции DECLARE CURSOR, имеющимися в SQL Server, такими, как LOCAL, GLOBAL, STATIC, KEYSET, DYNAMIC, FASTFORWARD и так далее. Может использоваться только в инструкции DECLARE CURSOR стиля SQL92, например DECLARE образец CURSOR INSENSITIVE FOR инструкция_select FOR UPDATE.
FORWARDJDNLY
Показывает, что курсор должен перемещаться от первой к последней записи в результирующем наборе и единственной поддерживаемой формой инструкции FETCH является FETCH NEXT. Если не используются ключевые слова STATIC или KEYSET, предполагается, что курсор объявлен как DYNAMIC. Предложения FAST_FORWARD и FORWARDJDNLYявляются взаимоисключающими.
SCROLL
Включаются все опции инструкции FETCH (ABSOLUTE, FIRST, LAST, NEXT, PRIOR и RELATIVE). В противном случае доступна только опция FETCH NEXT. Если используются ключевые слова DYNAMIC, STATIC или KEYSET, предложение SCROLL используется по умолчанию. Предложения FASTJFORWARD и FORWARDJDNLYявляются взаимоисключающими.
STATIC | KEYSET DYNAMIC FASTFORWARD
Определяет, как осуществляется манипулирование данными в результирующем наборе. Эти параметры несовместимы с предложениями FOR READ ONLY и FOR UPDATE. Существует четыре опции.
STATIC
Создается временная копия результирующего набора данных, которая сохраняется в базе данных tempdb. Модификации, внесенные в исходную таблицу, при обработке курсора не видны. Курсоры с предложением STATIC не могут изменять данные в исходной таблице или представлении.
KEYSET
В базе данных tempdb создается временная копия результирующего набора с членством и фиксированным порядком строк (который также называется набором ключей, keyset). Набор ключей связывает данные в результирующем наборе данных курсора с базовой таблицей или представлением, и курсор может видеть изменения, вносимые в базовые данные. Измененные или удаленные строки имеют @@FETCH_STATUS, равный -2 (если обновление не проводилось с помощью инструкции UPDATE…WHERE CURRENT OF, в противном случае они видны полностью), тогда как строки, вставленные другими пользователями, не видны вообще.
DYNAMIC
Записи в результирующем наборе данных курсора определяются при выполнении каждой операции FETCH. Таким образом, курсоры с предложением DYNAMIC видят все изменения, вносимые в базовую таблицу или представление, даже те, которые внесены другими пользователями. Поскольку результирующий набор может постоянно изменяться, курсоры DYNAMIC не поддерживают предложение FETCH ABSOLUTE.
FASTFORWARD
Создается курсор FORWARD ONLY READ ONLY, который быстро прочитывает весь результирующий набор курсора сразу.