Каждое выполнение инструкции 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 И не может быть изменен;
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.