Объявление курсораПервое, что выполняется при работе с курсорами - это их объявление. Объявление курсора выполняется с помощью команды declare cursor. SQL Server поддерживает два формата этой команды. Первый из них соответствует требованиям стандарта ANSI SQL-92 и предоставляет базовый набор опций. Второй же формат является собственной разработкой Microsoft и предоставляет пользователям более широкий набор возможностей. Рассмотрим оба варианта команды чуть позже, а сейчас поговорим о стандарте ANSI SQL-92: DECLARE cursor_name [INSENSITIVE] [SCROLL] CURSOR FOR select_statement [FOR {READ ONLY I UPDATE [OF column_name [,...n]]] Рассмотрим назначение параметров команды:
cursor_name — имя курсора, которое в дальнейшем будет использоваться для обращения к нему. Имя курсора должно удовлетворять общим требованиям именования объектов. В отличие от имени переменной, имя курсора не должно начинаться символом @.
insensitive — это ключевое слово предписывает серверу создать статический курсор. Результирующий набор курсора будет размещаться в базе данных tempdb. Работа с таким курсором будет разрешена лишь в режиме "только для чтения". Если ключевое слово insensitive не указывается, то создается динамический курсор.
scroll — в создаваемом курсоре можно выполнять выборку данных в произвольном порядке. Если же опция scroll не указывается, то курсор можно будет просматривать только последовательно, в направлении от первой строки к последней. Однако не нужно путать курсор, не обеспечивающий выборку в произвольном порядке, с последовательным курсором.
select_statement — указывает код запроса select, применяемого для формирования результирующего набора курсора. При написании кода запроса следует учитывать, что в запросе не допускается наличие разделов INTO, GROUP BY И COMPUTE.
read only — работа с курсором будет возможна в режиме "только для чтения". Указывать этот параметр не обязательно при создании статического курсора, который по своей природе не допускает изменений. Однако не нужно путать курсор "только для чтения" со статическим курсором. Применение параметра read only для динамических курсоров позволяет повысить скорость операций работы с курсором.
update [of column__name [,...n]] — разрешает выполнять с помощью курсора изменение исходных данных. Не разрешается применение этого параметра совместно с параметром insensitive. Аргумент column_name [,...n] определяет список столбцов, для которых будет поддерживать возможность изменения данных. Если имена столбцов не указаны, то по умолчанию разрешается обновлять все столбцы курсора.
Как видим, стандарт ANSI SQL-92 предоставляет пользователям весьма скудные возможности работы с курсорами. В частности, пользователи не могут работать с ключевыми и последовательными курсорами.
Более широкие возможности по созданию курсоров предоставляет команда declare cursor формата Transact-SQL:
DECLARE cursor_name CURSOR [LOCAL | GLOBAL] [FORWARD_ONLY | SCROLL] [STATIC | KEYSET | DYNAMIC | FAST_FORWARD] [READ_ONLY I SCROLL_LOCKS | OPTIMISTIC] [TYPE_WARNING] FOR select_statement [FOR UPDATE [OF column_name [,...n]]]
Рассмотрим назначение параметров этого формата команды, однако опустим параметры, уже описанные ранее: local — создаваемый курсор будет локальным, то есть будет существовать только во время выполнения транзакции, хранимой процедуры или пакета команд. По завершении работы создавшей курсор транзакции, процедуры или пакета происходит неявное удаление курсора, причем даже в том случае, если курсор не был закрыт. Данные локального курсора могут быть переданы из хранимой процедуры при указании параметра output. Курсор доступен только в пределах создавшей его структуры.
global — предписывает создать глобальный курсор, который будет существовать вплоть до закрытия соединения, в котором он был создан. При этом не важно, был ли создан курсор в хранимой процедуре, пакете или триггере. Однако, хотя курсор и называют глобальным, видно его будет только в пределах соединения, в котором он был создан.
forward_only — предписывает серверу создать курсор, из которого возможна только последовательная выборка в направлении от первой строки к последней.
scroll — в отличие от предыдущего параметра, позволяет создавать курсор, допускающий выборку данных в произвольном порядке.
static — будет создан статический курсор.
keyset — предписывает создание ключевого курсора.
dynamic — предписывает создание динамического курсора.
fast_forward — совместно с параметром read_only позволяет создавать курсор, оптимизированный для последовательного просмотра данных, то есть когда строки выбираются друг за другом в направлении от первой к последней. Применение fast_forward не допускается совместно с параметрами SCROLL ИЛИ FOR_UPDATE. Кроме того, параметры FORWARD_ONLY И FAST_FORWARD являются взаимоисключающими.
read_only — позволяет запретить применение курсора для выполнения любых изменений исходных данных (изменение или удаление). Параметр read_only не является обязательным для статического курсора. Использование же этого параметра с курсорами других типов позволяет оптимизировать операции работы с курсорами. Рекомендуется всегда указывать этот параметр, если не предполагается выполнять изменения с помощью курсора.
scroll_locks — сервер блокирует все строки, входящие в результирующий набор. Это повышает скорость операций чтения и модификации Данных с помощью курсора, т. к. не надо ожидать каждый раз разблокирования нужных ресурсов. Одновременное использование параметров fast_forward и scroll_locks не допускается.
optimistic — позволяет контролировать попытки изменения через курсор данных, которые уже были изменены пользователями. При этом не применяется полное блокирование данных результирующего набора, как это происходит при указании параметра scroll_locks. Если в исходной таблице есть столбец timestamp, то он автоматически используется для отслеживания изменений. Если же такого столбца нет, то выполняется подсчет контрольной суммы каждой строки результирующего набора курсора. Когда пользователь пытается выполнить изменение или удаление данных, происходит сравнение значений, хранимых во внутренних структурах курсора, со значениями строки. Если они совпадают, то изменения выполняются. В противном случае генерируется сообщение о том, что исходные данные были изменены, и операция откатывается. Не допускается одновременное применение опций fast_forward и optimistic.
type_warning — если пользователь неверно указал тип создаваемого курсора, то сервер выполняет неявное автоматическое преобразование типа курсора. При этом по умолчанию пользователь не получает никакого сообщения о выполняемых изменениях. Параметр type_warning предписывает серверу в обязательном порядке информировать пользователя о выполняемом преобразовании типа курсора. Приведем пример создания курсора с применением переменной:
DECLARE @state char(2) SET @state = 'CA' DECLARE [auth state] CURSOR SCROLL KEYSET LOCAL FOR SELECT au__id, au_lname, au__fname, state FROM authors WHERE state = @state
Порядок расположения строк в курсоре соответствует их порядку в результате выборки, возвращаемой после выполнения ассоциированного с курсором запроса select. С помощью раздела order by пользователи могут управлять порядком расположения строк в курсоре.
|