1. [LOCAL | GLOBAL] – необязательная составляющая описания, которая показывает область действия (видимости) курсора: LOCAL – для пакета, процедуры; GLOBAL – для соединения в целом. Значение по умолчанию определяется опцией используемой БД default to local cursor, которая, как правило, установлена в FALSE.
2. [FORWARD_ONLY | SCROLL] - необязательная составляющая описания, которая показывает порядок извлечения данных из курсора. FORWARD_ONLY – предполагает последовательное извлечение всех строк курсора от 1-ой до последней (FETCH NEXT). SCROLL – предполагает возможность использования всех 6 способов извлечения (FETCH FIRST, FETCH LAST, FETCH PRIOR, FETCH NEXT, FETCH RELATIVE, FETCH ABSOLUTE) строк из курсора.
3. [STATIC | KEYSET | DYNAMIC | FAST_FORWARD] - необязательная составляющая описания, которая определяет свойства курсора по связанности с исходной таблицей (таблицами).
· STATIC – описывает курсор, при создании которого делается временная копия данных, содержащихся в курсоре.
· KEYSET – определяет последовательность строк, принадлежащих курсору, которая фиксируется во время открытия курсора. При этом множество ключей, однозначно определяющих каждую строку курсора, сохраняются во временной БД tempdb. Изменение неключевых значений в исходной таблице (таблицах) отображаются для курсора. Вставка новых строк в исходную таблицу (таблицы)– не отображается для курсора. Изменение ключевых значений в исходной таблице (таблицах) не отображается для курсора, а извлечение удаленной строки из курсора приводит к ошибке (функция @@FETCH_STATUS возвращает значение -2). Однако, изменения сделанные с использованием конструкции WHERE CURRENT OF отображаются для курсора.
· DYNAMIC – описывает курсор, отображающий все изменения в исходных таблицах. Последовательность строк, принадлежность к курсору также может меняться для каждой очередной выборки данных из курсора. При использовании этой опции извлечение данных с помощью команды FETCH ABSOLUTE недопустимо.
· FAST_FORWARD – курсор, имеющий свойства FORWARD_ONLY и READ_ONLY и использующий некую оптимизацию при работе. Не совместимо с FOR UPDATE, с FORWARD_ONLY и с OPTIMISTIC.
Следует отметить, что:
· Если указано свойство FORWARD_ONLY, и не выбрано ни одно из свойств [STATIC | KEYSET | DYNAMIC | FAST_FORWARD], то по умолчанию выбирается свойство DYNAMIC.
· Если указано свойство SCROLL, и не выбрано ни одно из свойств [STATIC | KEYSET | DYNAMIC | FAST_FORWARD], то по умолчанию выбирается свойство KEYSET.
· Если не указано ни одно из свойств [FORWARD_ONLY | SCROLL] и указано одно из свойств [STATIC | KEYSET | DYNAMIC], то выбирается SCROLL, иначе - FORWARD_ONLY.
· Если не указано ни одно из свойств [FORWARD_ONLY | SCROLL] и [STATIC | KEYSET | DYNAMIC | FAST_FORWARD], то по умолчанию выбирается FORWARD_ONLY и DYNAMIC, соответственно.
· Если запрос SELECT содержит рекурсивное CTE, то курсор может иметь только свойства (тип) STATIC или FAST_FORWARD. Если это не так, то тип курсора будет автоматически преобразован в STATIC.
4. [READ_ONLY | SCROLL_LOCKS | OPTIMISTIC] - необязательная составляющая описания, которая определяет поведение курсора при обновлении данных с его использованием (конструкция WHERE CURRENT OF для команд UPDATE и DELETE). Значение по умолчанию OPTIMISTIC, если не указано свойство STATIC или FAST_FORWARD, иначе - READ_ONLY.
· READ_ONLY – запрещает изменение данных исходной таблицы (таблиц) с использованием курсора. Не совместимо с [FOR UPDATE [OF список_имен_столбцов_разделенных_запятыми]].
· SCROLL_LOCKS – гарантирует успешность изменения данных исходной таблицы (таблиц) с использованием курсора.
· OPTIMISTIC – гарантирует успешность изменения данных исходной таблицы (таблиц) с использованием курсора, если строка была изменена после создания курсора.
5. [TYPE_WARNING] - необязательная составляющая описания, которая указывает на необходимость сообщения клиенту, создавшему курсор, в случае неявного преобразования типа курсора.
6. FOR <команда SELECT> - обязательная составляющая описания, которая определяет запрос SELECT, наполняющий (связывающий) курсор данными. В этом запросе SELECT не допустимы секции COMPUTE, COMPUTE BY, FOR BROWSE, INTO.
7. [FOR UPDATE [OF список_имен_столбцов_разделенных_запятыми]] - необязательная составляющая описания, которая задает список столбцов, которые могут быть изменены через курсор в конструкции WHERE CURRENT OF. Если указано только FOR UPDATE, то, используя курсор, можно менять все столбцы исходной таблицы (таблиц). Если присутствует [OF список_имен_столбцов_разделенных_запятыми], то через курсор можно менять только те столбцы, которые присутствуют в списке после слова OF. При использовании опций SCROLL_LOCKS или OPTIMISTIC необязательно использовать FOR UPDATE без указания списка столбцов, т.к. это предполагается по умолчанию.
Можно также описать переменную типа курсор следующим образом:
DECLARE @cursor_var cursor
а в дальнейшем с помощью команды SET присвоить этой переменной уже описанный курсор или описать курсор прямо в команде SET.
OPEN
Команда OPEN служит для открытия курсора, а также для наполнения его данными (выполнения соответствующего запроса SELECT). Она имеет следующий синтаксис:
OPEN {[GLOBAL] <имя курсора> | @cursor_variable},
где ключевое слово GLOBAL показывает, что курсор с именем <имя курсора> является глобальным.
FETCH.
Команда FETCH служит для извлечения строки из курсора и имеет следующий синтаксис:
FETCH
[
[NEXT | PRIOR | FIRST | LAST |
ABSOLUTE {номер строки | @var} |
RELATIVE {номер строки | @var}
]
FROM
]
{[GLOBAL] <имя курсора> | @cursor_variable}
[INTO @var1, @var2, …]
1. [NEXT | PRIOR | FIRST | LAST | ABSOLUTE {номер строки | @var} | RELATIVE {номер строки | @var}] – необязательная часть команды, которая определяю извлекаемую из курсора строку (если используется, то обязательно использовать ключевое слово FROM):
· NEXT – извлечь следующую строку после текущей и сделать ее текущей. Если курсор только открыт, то извлекается 1-ая строка и она же становится текущей. Эта опция является опцией по умолчанию.
· PRIOR - извлечь предыдущую строку перед текущей и сделать ее текущей. Если курсор только открыт, то строка не извлекается.
· FIRST – извлечь 1-ую строку курсора и сделать ее текущей.
· LAST - извлечь последнюю строку курсора и сделать ее текущей.
· ABSOLUTE {номер строки | @var} – после ключевого слова ABSOLUTE указывается либо номер извлекаемой строки, либо переменная, содержащая этот номер. Если номер положительный, то отсчет строки ведется от начала курсора, если отрицательный – с конца. Если номер = 0, то строка не извлекается. Если строка извлекается, то она становится текущей.
· RELATIVE {номер строки | @var} – после ключевого слова RELATIVE указывается либо номер извлекаемой строки, либо переменная, содержащая этот номер. Если номер положительный, то отсчет строки ведется от текущей строки курсора вниз, если отрицательный – от текущей строки курсора вверх. Если номер = 0, то извлекается текущая строка. Если при первом после открытии выполнении команды FETCH указывается отрицательный номер или 0, то строка не извлекается. Если строка извлекается, то она становится текущей.
2. {[GLOBAL] <имя курсора> | @cursor_variable} – задает курсор с помощью имени курсора или переменной. Ключевое слово GLOBAL показывает, что курсор является глобальным.
3. [INTO @var1, @var2, …] – необязательная часть команды, позволяющая выводить значения элементов извлекаемой строки не на экран, а в переменные. Количество и типы данных переменных должны совпадать с количеством и типами данных извлекаемых столбцов.
CLOSE.
Закрывает указанный открытый курсор, освобождая все блокировки данных сделанные курсором и выбранное курсором множество строк (после выполнения этой команды обращения к курсору недопустимо, если не выполнить повторное открытие). Однако после выполнение команды OPEN с закрытым курсором снова можно работать (извлекать данные). Команда имеет следующий синтаксис:
CLOSE {[GLOBAL] <имя курсора> | @cursor_variable},
где ключевое слово GLOBAL показывает, что курсор с именем <имя курсора> является глобальным.