КУРСОРЫ


Главная - Примеры разработки 1С - КУРСОРЫ

Курсоры позволяют обрабатывать данные для каждой возвращаемой строки отдельно, не пользуясь множественными, традиционными для SQL операциями. Эти курсоры - серверные (server-based), и их не следует путать с курсорами, предоставляемыми DB-Library или ODBC. Для работы с курсорами используются следующе операторы:
Оператор Описание
DECLARE CURSOR Создает курсор
OPEN Открывает курсор
FETCH Выбирает данные
CLOSE Закрывает ранее открытый курсор
DEALLOCATE Уничтожает ранее созданый курсор Для обновления текущей сроки используется следующая форма оператора UPDATE:
UPDATE table_name
SET column_name1 =
{expression1 | NULL | (select_statement)}
[, column_name2 =
{expression2 | NULL | (select_statement)}...]
WHERE CURRENT OF cursor_name
а для удаления - следующая:
DELETE FROM table_name
WHERE CURRENT OF cursor_name
Курсор объявляется оператором DECLARE:
DECLARE cursor_name [INSENSITIVE] [SCROLL] CURSOR
FOR select_statement
[FOR {READ ONLY | UPDATE [OF column_list]}]
Оператор OPEN служит для открытия курсора. Он имеет следующий синтаксис: OPEN cursor_name После открытия курсора в переменной @@CURSOR_ROW может быть одно из следующих значений:
-m
В этом случае данные для курсора выгребаются асинхронно. Значение m представляет число уже выбранных записей.
n
Все данные получены, n - число записей
0
Курсор не открыт
Оператор FETCH служит для получения данных. Он имеет следующий синтаксис:
FETCH [[NEXT | PRIOR | FIRST | LAST | ABSOLUTE n | RELATIVE n] FROM] cursor_name
[INTO @variable_name1, @variable_name2, ...]
NEXT
Получает следующую запись
PRIOR
Получает предыдущую запись
FIRST
Получает первую запись
LAST
Получает последнюю запись
ABSOLUTE
Получает n-ю запись
RELATIVE
Получает n-ю запись относительно текущей
Для того, чтобы опции PRIOR, LAST, FIRST, ABSOLUTE и RELATIVE были доступны, необходимо, чтобы курсор был создан с опцией SCROLL.
Глобальная переменная @@FETCH_STATUS возвращает результат последнего fetch а -
0
Все нормально, данные получены
-1
Курсор кончился
-2
Текущая строка не является более членом требуемого множества записей, заданного в операторе select при объявлении курсора.
Оператор CLOSE закрывает ранее созданный курсор, однако структуры данных, необходимых для его функционирования остаются нетронутыми; таким образом, курсор позднее может быть открыт вновь.
Оператор DEALLOCATE закрывает курсор и уничтожает все связанные с ним структуры данных.
Example

DECLARE @Name varchar(40)
DECLARE CT CURSOR FOR SELECT Name from Peoples
OPEN CT
WHILE 1=1 BEGIN
FETCH FROM CT INTO @Name
/*Так, на мой взгляд, удобнее обходиться с курсорами*/
IF @@fetch_status=-1
BREAK
IF @@fetch_status=-2
CONTINUE
PRINT @Name
END
DEALLOCATE CT