Мониторинг курсоров 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', 'курсорная_переменная') |