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

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

В настоящей работе подробно изучается только первый тип курсоров.

По способу обращения к данным можно выделить две категории курсоров:

·  последовательные – разрешают только последовательное считывание строк, от первой и до последней; переход к следующей строке происходит автоматически после обработки текущей строки, без вмешательства пользователя;

·  прокручивающие – позволяют совершать произвольные переходы между строками набора.

Третий тип классификации связан с многократностью выполнения select-запроса и способом хранения результирующего набора.

Запрос статического курсора выполняется только один раз – при открытии. Результирующий набор физически сохраняется во временной таблице системной базы данных Tempdb. Любые изменения исходных данных до закрытия курсора никак не отражаются на их копии во временной таблице. Чтобы произвести повторную выборку, обновить результирующий набор, курсор следует закрыть и открыть повторно.

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

Третий тип в данной классификации – ключевые курсоры. Они в целом напоминают статические курсоры: выборку производят только при открытии и сохраняют результаты во временной таблице. Но таблица эта содержит не строки запроса целиком, а лишь ключевые поля, позволяющие однозначно идентифицировать строки исходных таблиц. Положительная сторона такого подхода: любые изменения, сделанные в неключевых столбцах исходных таблиц, отразятся в курсоре. Недостатки: так как набор ключей формируется только один раз, добавление в исходные таблицы новых строк, удовлетворяющих условиям запроса, не найдет отражения в ключевом курсоре. Также удаление строк, входящих в результирующий набор, или изменение их ключевых столбцов трактуется при использовании ключевого курсора как «повреждение» (сами строки при этом называются «поврежденными», хотя о физическом повреждении речь вовсе не идет).

2.2.4. Работа с курсорами Transact-SQL

2.2.4.1. Объявление курсора

Выполняется с помощью команды declare cursor. SQL Server поддерживает два формата этой команды. Первый из них соответствует стандарту ANSI-92:

declare имя_курсора [insensitive] [scroll] cursor

           for запрос

           [for {read only | update [of имя_столбца [,…n]]}]

Использование ключевого слова  insensitive в вызове предписывает создать статический курсор.

Указание опции scroll соответствует объявлению прокручивающего курсора.

Указание опции readonly разрешает работу с курсором только в режиме чтения. Параметр update […] разрешает модифицировать исходные данные с помощью курсора. При этом допускается указывать список столбцов (подсекция of), модификация которых допускается; по умолчанию разрешается модифицировать все столбцы результирующего набора. Считается, что статическому курсору всегда соответствует опция readonly, поэтому использование update […] совместно с insensitive – недопустимо.

Второй формат оператора declare cursor установлен компанией Microsoft непосредственно для Transact-SQL.

declare имя_курсора cursor

           [local | global]

           [forward only | scroll] [static | keyset | dynamic | fast_forward]

           [read_only | scroll_locks | optimistic] [type_warning]

           for запрос [for {read only | update [of имя_столбца [,…n]]]