Программирование на T-SQL. Хранимые процедуры. Создание хранимых процедур. Переменные, параметры и коды возврата, страница 6

Каждое выполнение инструкции FETCH также устанавливает значение глобальной переменной @@FETCH_STATUS.  

Обычно для многократной обработки курсора используется цикл WHILE, извлекающий одну строку в каждом проходе тела цикла. Цикл WHILE выполняется до тех пор, пока @@FETCH_STATUS = 0

@@FETCH_STATUS возвращает состояние последней инструкции FETCH курсора:

     0      - инструкция FETCH была выполнена успешно.

-1  - выполнение инструкции FETCH завершилось неудачно или строка оказалась вне пределов результирующего набора.

-2  - выбранная строка отсутствует.

Далее приведен пример.

DECLARE @ProductID      INT,

                 @ProductName    VARCHAR(50), 

                 @ListPrice      MONEY

DECLARE curproducts CURSOR FOR

 SELECT ProductID, ProductName, ListPrice FROM Products.Product 

FOR READ ONLY

OPEN curproducts

FETCH curproducts INTO @ProductID, @ProductName, @ListPrice

WHILE @@FETCH_STATUS = 0

BEGIN

 SELECT @ProductID, @ProductName, @ListPrice

 FETCH curproducts INTO @ProductID, @ProductName, @ListPrice END

CLOSE curproducts 

DEALLOCATE curproducts

Вы можете объявлять курсоры четырех разных типов.

FAST_FORWARD (по умолчанию) — самый быстродействующий тип курсора, поскольку позволяет перемещаться только вперед от одной строки к другой. Прокрутка не поддерживается. Курсор FAST_FORWARD эквивалентен курсору, объявленному какFORWARD_ONLY, READ_ONLY.

STATIC— результирующий набор курсора этого типа извлекается и сохраняется во временной таблице в базе данных tempdb. Все инструкции FETCH выполняются во временной таблице, и изменения таблиц, служащих основой для курсора, не видны. Курсор типа STATIC поддерживает прокрутку, но изменения для него запрещены.

KEYSET — у этого типа курсора набор ключей, однозначно идентифицирующих каждую строку результирующего набора, сохраняется во временной таблице в базе данных tempdb. При прокрутке курсора неключевые столбцы извлекаются из таблиц, служащих основой курсора. Следовательно, любые изменения строк отражаются в курсоре по мере его прокрутки. Любые вставки в базовую таблицу не доступны для курсора. Если вы попытаетесь обратиться к строке, которая была удалена, переменная @@FETCH_STATUS вернет значение -2.

DYNAMIC  — самый дорогостоящий тип курсора. В нем отражаются все изменения, сделанные в базовом результирующем наборе, включая вновь вставленные строки, появляющиеся по мере прокрутки курсора. Позицию строки и порядок строк в курсоре можно изменять при каждом выполнении инструкции FETCH. Для динамических курсоров недоступен параметр FETCH ABSOLUTE.

Доступ к строкам в курсоре можно ограничить с помощью параметров FORWARD ONLY и SCROLL. 

v  Если курсор объявлен какFORWARDONLY, каждая строкаможет быть прочитана один раз по мере продвижения указателя курсора в результирующем наборе. 

v  Если вы объявляете курсор с параметром SCROLL, у инструкции FETCH появляются следующие варианты:

FETCHFIRST — извлечение первой строки в результирующем наборе;

FETCHLAST — извлечение последней строки в результирующем наборе;

FETCHNEXT — извлечение из результирующего набора следующей строки по отношению к текущей позиции указателя;

FETCHPRIOR— извлечение из результирующего набора строки, непосредственно предшествующей текущей позиции указателя курсора;

FETCHABSOLUTE n — извлечение n-й строки, считая от начала результирующего набора;

FETCHRELATIVE n — извлечение n-й строки, считая от текущей позиции указателя в результирующем наборе курсора.

В языке T-SQL для курсоров есть три параметра, обеспечивающих параллелизм: v READONLY — SQL Server не запрашивает блокировку на базовую строку в таблице, т. к. курсор помечен как READONLY И не может быть изменен;