Мониторинг курсоров Transact-SQL
Transact-SQL предоставляет две глобальные переменные и функцию, которые помогают вам контролировать работу и состояние вашего курсора. Переменная @@CURSOR_ROWS возвращает количество строк во множестве последнего курсора, открытого в соединении. Значения, возвращаемые @@CURSOR_ROWS, представлены в таблице 27.1.
Таблица
27.1.
Значения, возвращаемые переменной @@CURSOR_ROWS.
Возвращаемое значение |
Описание |
-m |
Курсор заполнен записями не полностью; множество курсора на данный момент содержит m строк. |
-1 |
Курсор является динамическим, и количество строк может варьироваться. |
0 |
Курсор либо не открыт, а последний открытый курсор был закрыт и освобожден, либо курсор содержит нуль строк. |
n |
Количество строк в курсоре равно n. |
Переменная @@FETCH_STATUS возвращает информацию о выполнении последней команды FETCH. В таблице 27.2 представлены значения, возвращаемые переменной @@FETCH_STATUS.
Таблица
27.2.
Значения, возвращаемые переменной @@FETCH_STATUS.
Возвращаемое значение |
Описание |
0 |
Оператор FETCH был выполнен успешно. |
-1 |
Оператор FETCH был выполнен неудачно. |
-2 |
Извлекаемая строка отсутствует. |
Наконец, Transact-SQL предоставляет функцию CURSOR_STATUS. Эта функция имеет следующий синтаксис:
CURSOR_STATUS(тип, курсор_или_переменная)
Тип может иметь значения 'local', 'global' или 'variable', а курсор_или_переменная – это идентификатор курсора или курсорной переменной, информацию о котором требуется получить. Результаты, возвращаемые функцией CURSOR_STATUS, представлены в таблице 27.3.
Таблица
27.3.
Значения, возвращаемые функцией CURSOR_STATUS.
Возвращаемое значение |
Описание |
1 |
Если функция вызывалась для динамического курсора, множество курсора состоит из нуля, одной или нескольких строк. Если функция вызывалась для другого типа курсора, курсор состоит по меньшей мере из одной строки. |
0 |
Множество курсора пусто. |
-1 |
Курсор закрыт. |
-2 |
Возвращается только для курсорной переменной. Либо курсор, назначенный указанной переменной, закрыт, либо переменной не назначен какой-либо курсор. |
-3 |
Указанный курсор или курсорная переменная не существует. |
Используйте функции мониторинга курсором
- Нажмите кнопку Load Script (Загрузить сценарий)в панели инструмента анализатора запросов Query Analyzer. Query Analyzer отобразит диалоговое окно Open Query File (Открытие файла запроса).
- Выделите сценарий StatusFunctions и нажмите кнопку Open (Открыть). Query Analyzer загрузит сценарий в окно Query (Запрос).
- Нажмите кнопку Execute Query (Выполнить запрос)в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит запрос. Будет отображено четыре панели сетки. Первая создается оператором SELECT @@CURSOR_ROWS, а вторая – оператором FETCH. Третья панель сетки является результатом выполнения оператора SELECT @@FETCH_STATUS, а четвертая – результатом выполнения оператора SELECT CURSOR_STATUS ('local', 'simpleCursor').
Краткое содержание
Чтобы ... |
Синтаксис оператора SQL |
Создать курсор |
DECLARE имя_курсора CURSOR
[видимость]
[прокрутка]
[тип]
[блокировка]
[TYPE_WARNING]
FOR оператор_выборки
[FOR UPDATE [OF имена_столбцов]]
|
Открыть курсор |
OPEN [GLOBAL] курсор_или_переменная |
Закрыть курсор |
CLOSE [GLOBAL] курсор_или_переменная |
Освободить курсор |
DEALLOCATE [GLOBAL] курсор_или_переменная |
Использовать простую команду FETCH
|
FETCH курсор_или_переменная |
Извлечь строку с записью ее в переменные |
FETCH курсор_или_переменная INTO список_переменных |
Осуществить выборку строки по ее абсолютной позиции |
FETCH {FIRST | LAST | ABSOLUTE n) FROM курсор_или_переменная |
Осуществить выборку строки по ее относительной позиции |
FETCH {NEXT | PRIOR | RELATIVE n) FROM курсор_или_переменная |
Выполнить позиционное обновление |
UPDATE таблица_или_представление SET список_для_модификации WHERE CURRENT OF курсор_или_переменная |
Выполнить позиционное удаление |
DELETE таблица_или_представление WHERE CURRENT OF курсор_или_переменная |
Использовать функцию CURSOR_STATUS для запроса статуса курсора |
CURSOR_STATUS ('local', 'локальный_курсор') или CURSOR_STATUS ('global', 'глобальный_курсор') или CURSOR_STATUS ('variable', 'курсорная_переменная') |