Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






FOR select_statement




[FOR { READ ONLY | UPDATE [ OF column_list ] } ]

cursor_name - имя курсора.

INSENSITIVE – признак статического курсора. Изменения данных не разрешаются. Если ключевое слово INSENSITIVE не задано, по умолчанию создаётся динамический курсор.

SCROLL – прокрутка. Если данный параметр опускается, то курсор будет последовательным, т.е. его просмотр возможен только в одном направлении – от начала к концу.

select_statement – определяет тело запроса SELECT, с помощью которого задаётся набор строк курсора.

FOR READ ONLY – курсор «только для чтения»

FOR UPDATE [ OF column_list [,…n] ] – возможность изменения данных с помощью курсора в исходных таблицах. column_list [,…n] указывает список изменяемых столбцов.

Например:DECLARE auth_curs CURSOR

FOR SELECT * FROM authors или

DECLARE myCursor CURSOR

FOR SELECT OilName FROM Oils

DECLARE @ myCursorVariable CURSOR

SET @ myCursorVariable = myCursor

Можно сначала объявить курсорную переменную, а затем использовать её для создания курсора, например:

DECLARE @ myCursorVariable CURSOR

SET @ myCursorVariable CURSOR

LOCAL FAST_FORWARD FOR SELECT OilName FROM Oils

 

2. Открытие курсора. Объявление курсора создаёт объект курсора, но не создаёт набор записей. Для этого нужно открыть курсор.

OPEN [GLOBAL] cursor_name | cursor_variable_name

3. Выборка из курсора (считывание данных). После открытия курсора из него можно считывать данные с помощью команды FETCH. SQL Server 2000 позволяет считывать из курсора всего одну строку.

FETCH
[ [ NEXT | PRIOR | FIRST | LAST
| ABSOLUTE { n | @nvar }
| RELATIVE { n | @nvar }
]
FROM
]
{ { [ GLOBAL ] cursor _name } | @ cursor _variable_name }
[ INTO @variable_name [,...n ] ]

NEXT | PRIOR | FIRST | LAST – возвращается следующая, предыдущая, первая или последняя строка результирующего набора курсора. Эта строка становится текущей.

ABSOLUTE – возвращает строку по её абсолютному порядковому номеру.

RELATIVE – возвращает строку, находящуюся через n строк после текущей.

{ { [ GLOBAL ] cursor _name } | @ cursor _variable_name } – определяет имя курсора, из которого необходимо выбрать данные.

INTO @variable_name [,...n ] – задаёт список переменных, в которых будут сохранены соответствующие значения полей возвращаемой строки.

Например:

DECLARE simpleCursor CURSOR

LOCAL KEYSET

FOR SELECT OilName FROM Oils

DECLARE @theName char(20)

OPEN simpleCursor

-- Retrieve the first row into a variable

FETCH FIRST FROM simpleCursor INTO @theName

-- Retrieve the fifth row

FETCH ABSOLUTE 5 FROM simpleCursor INTO @theName

CLOSE simpleCursor

DEALLOCATE simpleCursor

 

4. Закрытие курсора. Закончив использовать курсор, вы должны его закрыть. Оператор CLOSE освобождает ресурсы, выделенные под курсор.

CLOSE [GLOBAL] cursor_name } | cursor_variable_name

 

5. Освобождение курсора. Оператор DEALLOCATE удаляет идентификатор или курсорную переменную, но не обязательно удаляет сам курсор.

DEALLOCATE [GLOBAL] cursor_name } | cursor_variable_name

 

Рассмотрим примеры:

 

-- Создание курсора

DECLARE myCursor CURSOR

KEYSET

READ ONLY

FOR select* FROM Oils

 

-- Создание курсорной переменной

DECLARE ©cursorVariable CURSOR

 

-- Создание множества записей курсора

OPEN myCursor

-- Назначение переменной курсору

SET@cursorVariable = myCursor

-- Освобождение курсора

DEALLOCATE myCursor

 

Дополнительно обсудим некоторые еще не упоминавшиеся аргументы.

  • LOCAL. При указании этого ключевого слова будет создан локальный курсор, видимый только в пределах создавшего этот курсор пакета, триггера, храни­мой процедуры или функции пользователя. После завершения пакета, триг­гера или хранимой процедуры курсор автоматически уничтожается сервером, если он еще не был уничтожен ранее. Так как локальный курсор доступен только в пределах той области, в контексте которой он был создан, то в раз­ных соединениях разрешается создание множества локальных курсоров с одинаковыми именами. Более того, вложенные процедуры, функции и триг­геры могут создавать локальные курсоры с такими же именами, что были объявлены на более высоком уровне. При работе с хранимыми процедурами имеется возможность передачи содержимого курсора из процедуры с исполь­зованием параметров.
  • GLOBAL. Указывая этот параметр, можно создать глобальный курсор, который не удаляется автоматически при завершении работы пакета, процедуры, триг­гера или функции, в которых он был создан. Автоматическое уничтожение глобального курсора происходит только в случае закрытия соединения, в кон­тексте которого он создан. Отметим, что глобальный курсор, несмотря на на­звание, доступен только в том соединении, в контексте которого он создан.

ВНИМАНИЕ В каждый момент времени можно создать два курсора (глобальный и локальный) с одинаковыми именами. Это связано с тем, что глобальный и локальный курсоры счи­таются сервером разными. Если используются курсоры с одинаковыми именами, то при обращении к ним следует явно указывать тип нужного курсора — глобальный или локальный. Если при создании курсора явно не указывается, какой он должен иметь тип, то он будет определяться значением параметра default to local cursor, ус­танавливаемом на уровне базы данных с помощью системной хранимой процедуры sp_dboption. Когда этот параметр установлен в ON, все создаваемые в контексте со­ответствующей базы данных курсоры будут локальными. По умолчанию этот параметр установлен в OFF, что означает создание глобальных курсоров. Для установки этого параметра в ON для базы данных pubs следует выполнить команду EXEC sp_dboption 'pubs', 'default to local cursor', 'on'.

  • FORWARD_ONLY. Будет создан последовательный курсор. Выборку данных из та­кого курсора можно осуществлять последовательно только в направлении от первой строки к последней.
  • FAST_FORWARD. Если для курсора READ_ONLY использовать этот параметр, то со­зданный курсор будет оптимизирован для быстрого доступа к данным. Пара­метр FAST_FORWARD не может быть использован совместно с параметрами FORWARD_ONLY, SCROLL, OPTIMISTIC и FOR UPDATE.
  • OPTIMISTIC. В курсоре, созданным с этим параметром, запрещается изменение или удаление строк, которые были изменены после открытия курсора. Для отслеживания изменений сервер использует столбец timestamp. Если такого столбца в таблице нет, то при открытии курсора сервер будет генерировать контрольную сумму для каждой строки и проверять ее при каждой попытке удаления или изменения строки. Этот параметр нельзя указывать совместно с параметром FAST_FORWARD.
  • TYPE_WARNING. При указании этого параметра сервер будет информировать пользователя о неявном изменении типа курсора, если он несовместим с за­просом SELECT.

 

Изменение исходных данных

В предыдущем разделе была рассмотрена выборка данных из курсора. Однако, курсоры позволяют не только выбирать данные, но и из­менять строки исходных таблиц. Идея использования курсора для изменения ис­ходных данных состоит в том, что изменяется строка таблицы, соответствующая текущей строке курсора. Как и обычное изменение данных, изменение данных при помощи курсора выполняется командой UPDATE. Отличие состоит в том, что при работе с курсорами в разделе WHERE этой команды необходимо указать параметр CURRENT OF, после которого будет следовать имя курсора. При этом нельзя указывать никаких логических выражений. В результате при обновлении таблицы с помощью курсора гарантированно будет изменено не более одной строки (или вообще ни одной). При использовании же стандартного синтаксиса команды UPDATE за один этап возможно изменение множества строк.

Отметим, что по умолчанию курсоры (как курсоры Transact-SQL, так и курсоры ANSI SQL-92) могут быть использованы для обновления. Причем поддержива­ется обновление всех столбцов исходных таблиц. Однако можно ограничить набор столбцов, которые будет разрешено изменять с помощью курсора. Для этого при объявлении курсора следует указать параметр FOR UPDATE OF и перечислить спи­сок столбцов исходной таблицы, которые нужно сделать доступными для обнов­ления. При этом не требуется, чтобы перечисляемые столбцы использовались в запросе SELECT, на основе которого будет строиться курсор.

Итак, пришло время рассмотреть синтаксис команды UPDATE, используемой при обновлении данных таблиц с помощью курсора:

UPDATE

{

table name WITH (<table.hint_limited> [...n ])

View_name






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных