Обработка результатов запросов. Подпрограммы в Transact-SQL (Лабораторная работа № 4), страница 5

Опции local | global позволяют создавать, соответственно, локальный и глобальный курсор. Локальный курсор существует только на время выполнения транзакции, подпрограммы или пакета команд. Он неявно закрывается и удаляется по завершении их работы. Глобальный курсор существует вплоть до закрытия соединения, в котором он был создан, поэтому чаще всего требуется закрывать и удалять его средствами Transact-SQL.

forward_only и scroll – опции создания, соответственно, последовательного и прокручивающего курсора.

Опции static, keyset и dynamic применяются для создания, соответственно, статического, ключевого и динамического курсора.

Опция read_only используется для создания курсора, только считывающего данные. Ее указание обязательно для статического курсора.

Если курсор указанного типа по тем или иным причинам не может быть создан, сервер автоматически преобразует этот тип в другой. При этом по умолчанию пользователь не получает никакой информации о выполненном преобразовании. Опция type_warning предписывает серверу обязательно информировать пользователя о преобразовании типа курсора.

Параметры scroll_locks и optimistic в настоящей работе не рассматриваются.

2.2.4.2. Открытие курсора

Открытие курсора выполняется с помощью оператора open:

open [global] имя_курсора

Параметр global указывается, если в данном соединении существуют локальный и глобальный курсоры с одинаковыми именами. По умолчанию открывается локальный курсор.

2.2.4.3. Просмотр данных

Для считывания строки из набора данных используется команда fetch, имеющая синтаксис:

fetch

[[next | prior | first | last | absolute {n | @nvar}| relative {n | @nvar}]

           from

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

[into @имя_переменной, [,…n]]

Непосредственно за словом fetch указывается строка, которую нужно выбрать. Можно указать либо абсолютную, либо относительную ее позицию:

·  next – задает переход на следующую строку, т. е. строку, располагающуюся в наборе непосредственно за текущей; эта опция используется по умолчанию; после открытия курсор автоматически устанавливается перед первой строкой набора, и при помощи конструкции fetch next можно установить его на первую строку;

·  prior – задает переход на предыдущую строку;

·  first – задает переход на первую строку;

·  last – задает переход на последнюю строку;

·  absolute – задает переход по абсолютному адресу (номеру строки); номер может указываться либо с помощью числовой константы (в описании обозначена n), либо с помощью целочисленной переменной (обозначена @nvar);

·  relative – задает смещение относительно текущей строки; отрицательной смещение перемещает курсор на {n | @nvar} строк назад, положительное – вперед.

После перемещения курсора, когда новая строка становится текущей, из нее сразу же считываются данные. В вызове оператора за заданием способа перемещения следует указание имени курсора за ключевым словом from. При необходимости перед именем курсора указывается ключевое слово global.

За ключевым словом into следует список переменных, в которые нужно считать значения всех (!) полей текущей строки. Переменные должны быть предварительно объявлены и иметь типы данных, соответствующие типам столбцов результирующего набора. Количество переменных должно в точности соответствовать количеству столбцов. Если секция into в команде опущена, значения текущих полей будут просто отображены в окне результатов SQL Server Management Studio.

2.2.4.4. Изменение и удаление данных с помощью курсоров

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

Изменение и удаление производится с помощью команд update и delete, но их синтаксис при совместном использовании с курсорами выглядит иначе, чем рассмотренный в лабораторной работе №2. А именно: