FETCH ;@@CURSOR_ROWS для определения количества строк во множестве курсора;@@FETCH_STATUS для определения результатов выполнения команды FETCH ;CURSOR_STATUS для запроса статуса курсора.Одним из характерных свойств реляционных баз данных является то, что действия выполняются над множествами строк. Множество может быть пустым, либо содержать только одну строку, но все равно оно считается множеством. Это необходимое и полезное свойство для
Например, поскольку нет возможности указать на определенную строку во множестве, представление пользователю строк по одной за раз может вызвать затруднения. Даже несмотря на то, что предоставляемые
Чтобы справиться с подобными ситуациями, в SQL предусмотрены курсоры. Курсор представляет собой объект, который указывает на определенную строку во множестве. В зависимости от сути созданного вами курсора, вы можете перемещать курсор внутри множества и модифицировать или удалять данные.
Microsoft SQL Server реально поддерживает два различных типа курсоров: курсоры
Курсоры . Как объект курсора, так и множество строк, на которое он указывает, должны существовать на сервере. Подобные курсоры называются серверными курсорами. Если вы используете серверный курсор из приложения, соединенного с SQL Server через сеть, каждая операция с курсором требует двустороннего сетевого взаимодействия. Библиотеки API-курсоров, поддерживающие серверные курсоры, поддерживают также клиентский курсор, который существует в клиентской системе и кэширует строки, которые он обрабатывает на клиенте.
Множество строк, на которое указывает курсор, определяется с помощью команды SELECT. При создании курсора SELECT накладываются несколько ограничений:
SELECT не может возвращать несколько результирующих множеств;SELECT не может содержать фразу INTO для создания новой таблицы;SELECT не может содержать фразу COMPUTE или COMPUTE BY, используемые для агрегирования результатов. (Однако, она может содержать функции агрегирования, например, AVG.)Отражение изменений
Способность курсора отражать изменения в данных называется чувствительностью курсора. Предположим, что вы создали курсор для оператора:
SELECT * FROM Oils WHERE Left(OilName, 1) = 'B'
База данных Aromatherapy вернет четыре строки, как показано на рис. 27.1. Если в процессе использования вами курсора кто-либо добавит значение Description для элемента Bergamot, либо добавит строку для элемента Bayberry, что произойдет с множеством строк, на которое указывает ваш курсор?
(рис 27.1) База данных Aromatherapy содержит четыре строки, начинающиеся с буквы В.При создании вашего курсора могут быть независимо определены два вида чувствительности: изменения каких строк включаются во множество (членство множества) и отражение изменений в исходных строках.
Прокрутка
Второй характеристикой курсора является способность осуществления прокрутки как вперед, так и назад, либо только вперед. Здесь имеет место извечная для программирования дилемма: скорость против гибкости.
Обновление
Последней характеристикой, используемой для классификации курсоров, является возможность обновления строк курсором. Опять же, курсоры "только чтение" обычно более производительны, но имеют меньшую гибкость.
Статические курсоры
SELECT, и хранит их в базе данных tempdb. Он "не чувствует" изменений в структуре или в значениях данных, а поскольку любые модификации будут отражены только в копии, этот курсор всегда открывается в режиме "только чтение".
Ключевые курсоры
Ключевой курсор копирует в базу tempdb только те столбцы, которые уникально идентифицируют каждую строку. Чтобы иметь возможность объявить ключевой курсор, каждая таблица, входящая в определение оператора SELECT, должна иметь
Ключевые курсоры могут быть как модифицируемыми, так и иметь режим "только для чтения". Они также могут быть прокручиваемыми или последовательными.
Членство в ключевом курсоре фиксируется на момент
Аналогично, если изменение вносится в строку, которая после этого не будет удовлетворять
Хотя членство во множестве курсора после открытия курсора остается фиксированным, тем не менее, изменения значений данных, вносимые в исходные таблицы, находят отражение. Например, изменение значения поля Description для строки Bergamot будет возвращено курсором. Однако изменения значений множества ключей отражаются в курсорах только в том случае, если они осуществляются внутри курсора. В продолжение предыдущего примера, если значение поля OilName было изменено с 'Basil' на 'Kumquat' внутри курсора, курсор вернет 'Kumquat'. Если же изменение было внесено другим пользователем, курсор по-прежнему будет возвращать 'Basil'.
Совет. Как мы увидим в следующем разделе, создание курсора и
Динамические курсоры
Динамический курсор ведет себя так, как если бы при каждом обращении к строке повторно выполнялся оператор SELECT. (На самом деле все происходит несколько иначе, но подобное представление позволяет лучше судить о работе
Для SELECT может содержать фразу ORDER BY только в том случае, если имеется индекс, включающий в себя столбцы, используемые в фразе ORDER BY. Если вы объявляете ключевой курсор с использованием фразы ORDER BY, не оперирующей индексом, SQL Server преобразует курсор в ключевой.
Курсоры быстрого доступа
SQL Server поддерживает специальную оптимизированную форму не FAST_FORWARD, и чаще всего его называют "пожарным" курсором (firehose).
"Пожарные" курсоры очень эффективны, но при их использовании имеются два важных ограничения. Во-первых, если в операторе определения SELECT курсора вы использовали столбцы с типом данных text, ntext или image, а также фразу TOP, SQL Server преобразует курсор в ключевой.
Во-вторых, если оператор SELECT, который вы использовали для определения курсора, содержит таблицы, имеющие триггеры, и таблицы, не имеющие триггеров, курсор преобразуется в статический. Триггеры представляют собой сценарии
Использование курсоров подобно использованию локальных переменных – вы объявляете их, устанавливаете значение, а затем используете. Однако, в отличие от локальных переменных, которые автоматически уничтожаются при выходе за пределы области действия, вы должны явным образом освобождать используемые курсором строки, а затем уничтожать курсор.
Первым шагом в использовании курсора является его создание. Курсоры .
Внимание! SQL Server поддерживает два различных метода создания курсоров: с использованием синтаксиса
Оператор имеет следующий синтаксис:
DECLARE имя_курсора CURSOR [видимость] [прокрутка] [тип] [блокировка] [TYPE_WARNING] FOR оператор_выборки [FOR UPDATE [OF имена_столбцов]]
Обратите внимание, что все параметры, определяющие характеристики курсора, – видимость, тип и т.д. – являются необязательными. Значениями по умолчанию для этих параметров являются сложными и могут указывать, либо не указывать способы взаимодействия с исходными записями или представлениями, а также опции работы с базой данных. Чтобы сделать восприятие оператора , более удобным, лучше явно задавать все необходимые вам параметры. При этом вы будете точно знать, что получите.
Видимость курсора определяется с помощью ключевых слов LOCAL или GLOBAL, которые имеют тот же эффект, что и ключевые слова @local_table или @@global_table при объявлении временных таблиц.
Совет. SQL Server будет закрывать и освобождать локальный курсор при выходе за пределы его области действия (видимости), но лучше всегда делать это явно.
Параметр прокрутка допускает использование ключевых слов FORWARD_ONLY и SCROLL, которые задают, соответственно, возможность перемещения только от начала к концу, или в любом направлении.
Параметр тип определяет тип создаваемого курсора. Здесь допустимы ключевые слова STATIC, KEYSET, DYNAMIC и FAST_FORWARD. Параметр типа FAST_FORWARD и параметр прокрутки FORWARD_ONLY являются взаимно исключающими.
Параметр блокировка определяет, могут ли строки модифицироваться курсором, и если да, то могут ли их модифицировать другие пользователи. Если используется ключевое слово READ_ONLY, курсор не может вносить никаких изменений в исходные данные. Тем не менее, другие пользователи могут модифицировать данные, либо это можете делать вы сами с помощью оператора UPDATE. Если в качестве параметра блокировка задано SCROLL_LOCKS, обновления могут быть выполнены только курсором. Все другие операторы UPDATE, как внутри этого же пакета, так и предоставляемые другими пользователями, выполняться не будут.
Последняя опция блокировки, OPTIMISTIC, позволяет осуществлять обновления строк как внутри курсора, так и вне его. Это наиболее гибкая опция, но при этом всегда существует вероятность, что модификация, выполненная курсором, окончится неудачей, если строка была изменена после ее чтения курсором.
Параметр TYPE_WARNING предписывает SQL Server отправлять SELECT.
Параметр оператор_выборки, указываемый в фразе FOR, является обязательным. Он задает строки, которые будут включены во множество курсора.
Фраза FOR UPDATE является необязательной. По умолчанию курсоры являются модифицируемыми, если не задан параметр READ_ONLY, однако и в этом случае лучше все-таки использовать эту фразу, чтобы быть уверенным в полученном результате. Вы можете использовать раздел OF имена_столбцов, чтобы указать OF имена_столбцов, модификация может быть выполнена для всех столбцов, указанных в операторе SELECT.
Курсорные переменные
CURSOR. В этом случае стандартный синтаксис DECLARE не создает курсор; вы должны явно установить переменную для курсора с помощью ключевого слова SET.
DECLARE myCursor CURSOR LOCAL FAST_FORWARD 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
При использовании такого синтаксиса курсор не имеет идентификатора, и ссылка на него может быть осуществлена только через переменную. Подобный синтаксис больше подходит для хранимых процедур, которые мы рассмотрим в уроке 28.
Открытие курсора
, синтаксис оператора кажется вполне прозрачным:
OPEN [GLOBAL] курсор_или_переменная
Ключевое слово GLOBAL помогает избежать конфликтов: если курсор, объявленный с ключевым словом LOCAL, и курсор, объявленный с ключевым словом GLOBAL, имеют одинаковый идентификатор, ссылки на курсор будут по умолчанию отнесены к локальному курсору, если вы не использовали ключевое слово GLOBAL. Как и в других подобных случаях, лучше явно указывать ключевое слово, если вы открываете глобальный курсор.
Закрытие курсора
Закончив использование курсора, вы должны его закрыть. Оператор CLOSE освобождает ресурсы, используемые для обслуживания множества курсора, а также освобождает все блокировки, наложенные на строки, если вы использовали параметр SCROLLOCKS в операторе DECLARE. Синтаксис команды CLOSE почти идентичен синтаксису оператора OPEN – меняется только ключевое слово:
CLOSE [GLOBAL] курсор_или_переменная
Освобождение курсора
Последним оператором в последовательности действий, связанных с созданием курсора, является оператор . Синтаксис его также прост:
DEALLOCATE [GLOBAL] курсор_или_переменная
Однако здесь есть одна тонкость: оператор удаляет идентификатор или курсорную переменную, но он не обязательно удаляет сам курсор. Сам курсор не удаляется до тех пор, пока все ссылающиеся на него идентификаторы будут либо освобождены, либо перестанут действовать (при выходе за пределы области действия). Рассмотрим следующие примеры:
-- Создание курсора DECLARE myCursor CURSOR KEYSET READ_ONLY FOR SELECT * FROM Oils -- Создание курсорной переменной DECLARE @cursorVariable CURSOR -- Создание множества записей курсора OPEN myCursor -- Назначение переменной курсору SET @cursorVariable = myCursor -- Освобождение курсора DEALLOCATE myCursor
После
Курсоры сами по себе не вызвали бы никакого интереса, если бы вы не могли осуществлять с их помощью определенные действия. и DELETE.
Команда извлекает указанную строку из множества строк курсора. В своем простейшем варианте команда имеет следующий синтаксис:
FETCH курсор_или_переменная
В этом формате записи возвращается строка в позиции курсора (текущая строка).
Используйте простую команду FETCH
Query
Query 

Query 
Совет. Возможно, вы обратили внимание, что этот сценарий выполняется дольше, чем соответствующий оператор SELECT. Дело в том, что создание и SELECT.
Команда может не только возвращать строку непосредственно, но и позволяет сохранять значения из возвращенного столбца в переменных. Чтобы сохранить результаты выполнения команды
FETCH курсор_или_переменная INTO список_переменных
Список_переменных есть перечень разделяемых запятыми идентификаторов переменных. Перед выполнением команды вы должны объявить переменные. Список_переменных должен содержать переменную для каждого столбца, фигурирующего в операторе SELECT, который определяет курсор. Тип данных переменной должен либо совпадать, либо быть совместимым с
Выберите строки с записью ее в переменные
Query 
Query 
Во всех предыдущих примерах оператор использовался для возвращения текущей строки. Синтаксис оператора также предусматривает ряд ключевых слов для указания другой строки. При использовании этих ключевых слов оператор будет возвращать заданную строку, и делать ее текущей.
Эти ключевые слова дают вам возможность задавать абсолютную позицию во множестве курсора. Ключевые слова FIRST и LAST возвращают первую и последнюю строки соответственно, в то время как ABSOLUTE n задает строку, отстоящую на n строк от начала (если n положительно) или от конца (если n отрицательно) множества записей курсора. Значение n может быть выражено в виде константы (3) или в виде переменной (@theRow).
Выберите строки по их абсолютной позиции
в панели инструментов анализатора запросов Query 

в панели инструментов анализатора запросов Query 
Помимо ключевых слов, дающих возможность извлекать строки по их абсолютной позиции, оператор предусматривает три ключевых слова, позволяющих извлекать строки по их позиции относительно текущей строки. Оператор возвращает следующую строку, оператор возвращает предыдущую строку, а оператор возвращает строку, отстоящую на n строк от текущей. Подобно оператору , оператор может задавать строки, предшествующие текущей, если n отрицательно, и строки, следующие за текущей, если n положительно.
Выберите строки по их относительной позиции
в панели инструментов анализатора запросов Query 

Query 
Если курсор имеет тип FORWARD_ONLY или PAST_FORWARD, для указания позиции может быть использовано только ключевое слово NEXT. В действительности, если курсор относится к одному из этих типов, ключевое слово NEXT не нужно. SQL Server предполагает, что каждый оператор фактически представляет собой оператор .
Используйте оператор FETCH NEXT для быстродействующего курсора
Query 

в панели инструментов анализатора запросов Query 
Если ваш курсор является модифицируемым. Изменение исходных значений во множестве курсора выполняется достаточно просто. Предусмотрена специальная форма фразы WHERE, которая поддерживает модификацию через курсор:
UPDATE таблица_или_представление SET список_для_модификации WHERE CURRENT OF курсор_или_переменная
Это называется позиционным обновлением.
DELETE таблица_или_представление WHERE CURRENT OF курсор_или_переменная
Выполните позиционное обновление
в панели инструмента анализатора запросов Query 

в панели инструментов анализатора запросов Query @@CURSOR_ROWS возвращает количество строк во множестве последнего курсора, открытого в соединении. Значения, возвращаемые @@CURSOR_ROWS, представлены в таблице 27.1.
| Возвращаемое значение | Описание |
|---|---|
| -m | Курсор заполнен записями не полностью; множество курсора на данный момент содержит m строк. |
| -1 | Курсор является динамическим, и количество строк может варьироваться. |
| 0 | Курсор либо не открыт, а последний |
| n | Количество строк в курсоре равно n. |
Переменная @@FETCH_STATUS возвращает информацию о выполнении последней команды . В таблице 27.2 представлены значения, возвращаемые переменной @@FETCH_STATUS.
| Возвращаемое значение | Описание |
|---|---|
| 0 | Оператор был выполнен успешно. |
| -1 | Оператор был выполнен неудачно. |
| -2 | Извлекаемая строка отсутствует. |
Наконец, CURSOR_STATUS. Эта функция имеет следующий синтаксис:
CURSOR_STATUS(тип, курсор_или_переменная)
Тип может иметь значения 'local', 'global' или 'variable', а курсор_или_переменная – это идентификатор курсора или курсорной переменной, информацию о котором требуется получить. Результаты, возвращаемые функцией CURSOR_STATUS, представлены в таблице 27.3.
| Возвращаемое значение | Описание |
|---|---|
| 1 | Если функция вызывалась для |
| 0 | Множество курсора пусто. |
| -1 | Курсор закрыт. |
| -2 | Возвращается только для курсорной переменной. Либо курсор, назначенный указанной переменной, закрыт, либо переменной не назначен какой-либо курсор. |
| -3 | Указанный курсор или курсорная переменная не существует. |
Используйте функции мониторинга курсором
в панели инструмента анализатора запросов Query 

в панели инструментов анализатора запросов Query | Чтобы ... | Синтаксис оператора SQL |
|---|---|
| Создать курсор | DECLARE имя_курсора CURSOR [видимость] [прокрутка] [тип] [блокировка] [TYPE_WARNING] FOR оператор_выборки [FOR UPDATE [OF имена_столбцов]] |
| Открыть курсор | OPEN [GLOBAL] курсор_или_переменная |
| Закрыть курсор | CLOSE [GLOBAL] курсор_или_переменная |
| Освободить курсор | |
Использовать простую команду |
|
| Извлечь строку с записью ее в переменные | |
| Осуществить выборку строки по ее абсолютной позиции | |
| Осуществить выборку строки по ее относительной позиции | |
| Выполнить позиционное обновление | UPDATE таблица_или_представление SET список_для_модификации WHERE CURRENT OF курсор_или_переменная |
| Выполнить позиционное удаление | DELETE таблица_или_представление WHERE CURRENT OF курсор_или_переменная |
Использовать функцию CURSOR_STATUS для запроса статуса курсора |
CURSOR_STATUS ('local', 'локальный_курсор') или CURSOR_STATUS ('global', 'глобальный_курсор') или CURSOR_STATUS ('variable', 'курсорная_переменная') |
FETCH ;@@CURSOR_ROWS для определения количества строк во множестве курсора;@@FETCH_STATUS для определения результатов выполнения команды FETCH ;CURSOR_STATUS для запроса статуса курсора.Одним из характерных свойств реляционных баз данных является то, что действия выполняются над множествами строк. Множество может быть пустым, либо содержать только одну строку, но все равно оно считается множеством. Это необходимое и полезное свойство для
Например, поскольку нет возможности указать на определенную строку во множестве, представление пользователю строк по одной за раз может вызвать затруднения. Даже несмотря на то, что предоставляемые
Чтобы справиться с подобными ситуациями, в SQL предусмотрены курсоры. Курсор представляет собой объект, который указывает на определенную строку во множестве. В зависимости от сути созданного вами курсора, вы можете перемещать курсор внутри множества и модифицировать или удалять данные.
Microsoft SQL Server реально поддерживает два различных типа курсоров: курсоры
Курсоры . Как объект курсора, так и множество строк, на которое он указывает, должны существовать на сервере. Подобные курсоры называются серверными курсорами. Если вы используете серверный курсор из приложения, соединенного с SQL Server через сеть, каждая операция с курсором требует двустороннего сетевого взаимодействия. Библиотеки API-курсоров, поддерживающие серверные курсоры, поддерживают также клиентский курсор, который существует в клиентской системе и кэширует строки, которые он обрабатывает на клиенте.
Множество строк, на которое указывает курсор, определяется с помощью команды SELECT. При создании курсора SELECT накладываются несколько ограничений:
SELECT не может возвращать несколько результирующих множеств;SELECT не может содержать фразу INTO для создания новой таблицы;SELECT не может содержать фразу COMPUTE или COMPUTE BY, используемые для агрегирования результатов. (Однако, она может содержать функции агрегирования, например, AVG.)Отражение изменений
Способность курсора отражать изменения в данных называется чувствительностью курсора. Предположим, что вы создали курсор для оператора:
SELECT * FROM Oils WHERE Left(OilName, 1) = 'B'
База данных Aromatherapy вернет четыре строки, как показано на рис. 27.1. Если в процессе использования вами курсора кто-либо добавит значение Description для элемента Bergamot, либо добавит строку для элемента Bayberry, что произойдет с множеством строк, на которое указывает ваш курсор?
(рис 27.1) База данных Aromatherapy содержит четыре строки, начинающиеся с буквы В.При создании вашего курсора могут быть независимо определены два вида чувствительности: изменения каких строк включаются во множество (членство множества) и отражение изменений в исходных строках.
Прокрутка
Второй характеристикой курсора является способность осуществления прокрутки как вперед, так и назад, либо только вперед. Здесь имеет место извечная для программирования дилемма: скорость против гибкости.
Обновление
Последней характеристикой, используемой для классификации курсоров, является возможность обновления строк курсором. Опять же, курсоры "только чтение" обычно более производительны, но имеют меньшую гибкость.
Статические курсоры
SELECT, и хранит их в базе данных tempdb. Он "не чувствует" изменений в структуре или в значениях данных, а поскольку любые модификации будут отражены только в копии, этот курсор всегда открывается в режиме "только чтение".
Ключевые курсоры
Ключевой курсор копирует в базу tempdb только те столбцы, которые уникально идентифицируют каждую строку. Чтобы иметь возможность объявить ключевой курсор, каждая таблица, входящая в определение оператора SELECT, должна иметь
Ключевые курсоры могут быть как модифицируемыми, так и иметь режим "только для чтения". Они также могут быть прокручиваемыми или последовательными.
Членство в ключевом курсоре фиксируется на момент
Аналогично, если изменение вносится в строку, которая после этого не будет удовлетворять
Хотя членство во множестве курсора после открытия курсора остается фиксированным, тем не менее, изменения значений данных, вносимые в исходные таблицы, находят отражение. Например, изменение значения поля Description для строки Bergamot будет возвращено курсором. Однако изменения значений множества ключей отражаются в курсорах только в том случае, если они осуществляются внутри курсора. В продолжение предыдущего примера, если значение поля OilName было изменено с 'Basil' на 'Kumquat' внутри курсора, курсор вернет 'Kumquat'. Если же изменение было внесено другим пользователем, курсор по-прежнему будет возвращать 'Basil'.
Совет. Как мы увидим в следующем разделе, создание курсора и
Динамические курсоры
Динамический курсор ведет себя так, как если бы при каждом обращении к строке повторно выполнялся оператор SELECT. (На самом деле все происходит несколько иначе, но подобное представление позволяет лучше судить о работе
Для SELECT может содержать фразу ORDER BY только в том случае, если имеется индекс, включающий в себя столбцы, используемые в фразе ORDER BY. Если вы объявляете ключевой курсор с использованием фразы ORDER BY, не оперирующей индексом, SQL Server преобразует курсор в ключевой.
Курсоры быстрого доступа
SQL Server поддерживает специальную оптимизированную форму не FAST_FORWARD, и чаще всего его называют "пожарным" курсором (firehose).
"Пожарные" курсоры очень эффективны, но при их использовании имеются два важных ограничения. Во-первых, если в операторе определения SELECT курсора вы использовали столбцы с типом данных text, ntext или image, а также фразу TOP, SQL Server преобразует курсор в ключевой.
Во-вторых, если оператор SELECT, который вы использовали для определения курсора, содержит таблицы, имеющие триггеры, и таблицы, не имеющие триггеров, курсор преобразуется в статический. Триггеры представляют собой сценарии
Использование курсоров подобно использованию локальных переменных – вы объявляете их, устанавливаете значение, а затем используете. Однако, в отличие от локальных переменных, которые автоматически уничтожаются при выходе за пределы области действия, вы должны явным образом освобождать используемые курсором строки, а затем уничтожать курсор.
Первым шагом в использовании курсора является его создание. Курсоры .
Внимание! SQL Server поддерживает два различных метода создания курсоров: с использованием синтаксиса
Оператор имеет следующий синтаксис:
DECLARE имя_курсора CURSOR [видимость] [прокрутка] [тип] [блокировка] [TYPE_WARNING] FOR оператор_выборки [FOR UPDATE [OF имена_столбцов]]
Обратите внимание, что все параметры, определяющие характеристики курсора, – видимость, тип и т.д. – являются необязательными. Значениями по умолчанию для этих параметров являются сложными и могут указывать, либо не указывать способы взаимодействия с исходными записями или представлениями, а также опции работы с базой данных. Чтобы сделать восприятие оператора , более удобным, лучше явно задавать все необходимые вам параметры. При этом вы будете точно знать, что получите.
Видимость курсора определяется с помощью ключевых слов LOCAL или GLOBAL, которые имеют тот же эффект, что и ключевые слова @local_table или @@global_table при объявлении временных таблиц.
Совет. SQL Server будет закрывать и освобождать локальный курсор при выходе за пределы его области действия (видимости), но лучше всегда делать это явно.
Параметр прокрутка допускает использование ключевых слов FORWARD_ONLY и SCROLL, которые задают, соответственно, возможность перемещения только от начала к концу, или в любом направлении.
Параметр тип определяет тип создаваемого курсора. Здесь допустимы ключевые слова STATIC, KEYSET, DYNAMIC и FAST_FORWARD. Параметр типа FAST_FORWARD и параметр прокрутки FORWARD_ONLY являются взаимно исключающими.
Параметр блокировка определяет, могут ли строки модифицироваться курсором, и если да, то могут ли их модифицировать другие пользователи. Если используется ключевое слово READ_ONLY, курсор не может вносить никаких изменений в исходные данные. Тем не менее, другие пользователи могут модифицировать данные, либо это можете делать вы сами с помощью оператора UPDATE. Если в качестве параметра блокировка задано SCROLL_LOCKS, обновления могут быть выполнены только курсором. Все другие операторы UPDATE, как внутри этого же пакета, так и предоставляемые другими пользователями, выполняться не будут.
Последняя опция блокировки, OPTIMISTIC, позволяет осуществлять обновления строк как внутри курсора, так и вне его. Это наиболее гибкая опция, но при этом всегда существует вероятность, что модификация, выполненная курсором, окончится неудачей, если строка была изменена после ее чтения курсором.
Параметр TYPE_WARNING предписывает SQL Server отправлять SELECT.
Параметр оператор_выборки, указываемый в фразе FOR, является обязательным. Он задает строки, которые будут включены во множество курсора.
Фраза FOR UPDATE является необязательной. По умолчанию курсоры являются модифицируемыми, если не задан параметр READ_ONLY, однако и в этом случае лучше все-таки использовать эту фразу, чтобы быть уверенным в полученном результате. Вы можете использовать раздел OF имена_столбцов, чтобы указать OF имена_столбцов, модификация может быть выполнена для всех столбцов, указанных в операторе SELECT.
Курсорные переменные
CURSOR. В этом случае стандартный синтаксис DECLARE не создает курсор; вы должны явно установить переменную для курсора с помощью ключевого слова SET.
DECLARE myCursor CURSOR LOCAL FAST_FORWARD 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
При использовании такого синтаксиса курсор не имеет идентификатора, и ссылка на него может быть осуществлена только через переменную. Подобный синтаксис больше подходит для хранимых процедур, которые мы рассмотрим в уроке 28.
Открытие курсора
, синтаксис оператора кажется вполне прозрачным:
OPEN [GLOBAL] курсор_или_переменная
Ключевое слово GLOBAL помогает избежать конфликтов: если курсор, объявленный с ключевым словом LOCAL, и курсор, объявленный с ключевым словом GLOBAL, имеют одинаковый идентификатор, ссылки на курсор будут по умолчанию отнесены к локальному курсору, если вы не использовали ключевое слово GLOBAL. Как и в других подобных случаях, лучше явно указывать ключевое слово, если вы открываете глобальный курсор.
Закрытие курсора
Закончив использование курсора, вы должны его закрыть. Оператор CLOSE освобождает ресурсы, используемые для обслуживания множества курсора, а также освобождает все блокировки, наложенные на строки, если вы использовали параметр SCROLLOCKS в операторе DECLARE. Синтаксис команды CLOSE почти идентичен синтаксису оператора OPEN – меняется только ключевое слово:
CLOSE [GLOBAL] курсор_или_переменная
Освобождение курсора
Последним оператором в последовательности действий, связанных с созданием курсора, является оператор . Синтаксис его также прост:
DEALLOCATE [GLOBAL] курсор_или_переменная
Однако здесь есть одна тонкость: оператор удаляет идентификатор или курсорную переменную, но он не обязательно удаляет сам курсор. Сам курсор не удаляется до тех пор, пока все ссылающиеся на него идентификаторы будут либо освобождены, либо перестанут действовать (при выходе за пределы области действия). Рассмотрим следующие примеры:
-- Создание курсора DECLARE myCursor CURSOR KEYSET READ_ONLY FOR SELECT * FROM Oils -- Создание курсорной переменной DECLARE @cursorVariable CURSOR -- Создание множества записей курсора OPEN myCursor -- Назначение переменной курсору SET @cursorVariable = myCursor -- Освобождение курсора DEALLOCATE myCursor
После
Курсоры сами по себе не вызвали бы никакого интереса, если бы вы не могли осуществлять с их помощью определенные действия. и DELETE.
Команда извлекает указанную строку из множества строк курсора. В своем простейшем варианте команда имеет следующий синтаксис:
FETCH курсор_или_переменная
В этом формате записи возвращается строка в позиции курсора (текущая строка).
Используйте простую команду FETCH
Query
Query 

Query 
Совет. Возможно, вы обратили внимание, что этот сценарий выполняется дольше, чем соответствующий оператор SELECT. Дело в том, что создание и SELECT.
Команда может не только возвращать строку непосредственно, но и позволяет сохранять значения из возвращенного столбца в переменных. Чтобы сохранить результаты выполнения команды
FETCH курсор_или_переменная INTO список_переменных
Список_переменных есть перечень разделяемых запятыми идентификаторов переменных. Перед выполнением команды вы должны объявить переменные. Список_переменных должен содержать переменную для каждого столбца, фигурирующего в операторе SELECT, который определяет курсор. Тип данных переменной должен либо совпадать, либо быть совместимым с
Выберите строки с записью ее в переменные
Query 
Query 
Во всех предыдущих примерах оператор использовался для возвращения текущей строки. Синтаксис оператора также предусматривает ряд ключевых слов для указания другой строки. При использовании этих ключевых слов оператор будет возвращать заданную строку, и делать ее текущей.
Эти ключевые слова дают вам возможность задавать абсолютную позицию во множестве курсора. Ключевые слова FIRST и LAST возвращают первую и последнюю строки соответственно, в то время как ABSOLUTE n задает строку, отстоящую на n строк от начала (если n положительно) или от конца (если n отрицательно) множества записей курсора. Значение n может быть выражено в виде константы (3) или в виде переменной (@theRow).
Выберите строки по их абсолютной позиции
в панели инструментов анализатора запросов Query 

в панели инструментов анализатора запросов Query 
Помимо ключевых слов, дающих возможность извлекать строки по их абсолютной позиции, оператор предусматривает три ключевых слова, позволяющих извлекать строки по их позиции относительно текущей строки. Оператор возвращает следующую строку, оператор возвращает предыдущую строку, а оператор возвращает строку, отстоящую на n строк от текущей. Подобно оператору , оператор может задавать строки, предшествующие текущей, если n отрицательно, и строки, следующие за текущей, если n положительно.
Выберите строки по их относительной позиции
в панели инструментов анализатора запросов Query 

Query 
Если курсор имеет тип FORWARD_ONLY или PAST_FORWARD, для указания позиции может быть использовано только ключевое слово NEXT. В действительности, если курсор относится к одному из этих типов, ключевое слово NEXT не нужно. SQL Server предполагает, что каждый оператор фактически представляет собой оператор .
Используйте оператор FETCH NEXT для быстродействующего курсора
Query 

в панели инструментов анализатора запросов Query 
Если ваш курсор является модифицируемым. Изменение исходных значений во множестве курсора выполняется достаточно просто. Предусмотрена специальная форма фразы WHERE, которая поддерживает модификацию через курсор:
UPDATE таблица_или_представление SET список_для_модификации WHERE CURRENT OF курсор_или_переменная
Это называется позиционным обновлением.
DELETE таблица_или_представление WHERE CURRENT OF курсор_или_переменная
Выполните позиционное обновление
в панели инструмента анализатора запросов Query 

в панели инструментов анализатора запросов Query @@CURSOR_ROWS возвращает количество строк во множестве последнего курсора, открытого в соединении. Значения, возвращаемые @@CURSOR_ROWS, представлены в таблице 27.1.
| Возвращаемое значение | Описание |
|---|---|
| -m | Курсор заполнен записями не полностью; множество курсора на данный момент содержит m строк. |
| -1 | Курсор является динамическим, и количество строк может варьироваться. |
| 0 | Курсор либо не открыт, а последний |
| n | Количество строк в курсоре равно n. |
Переменная @@FETCH_STATUS возвращает информацию о выполнении последней команды . В таблице 27.2 представлены значения, возвращаемые переменной @@FETCH_STATUS.
| Возвращаемое значение | Описание |
|---|---|
| 0 | Оператор был выполнен успешно. |
| -1 | Оператор был выполнен неудачно. |
| -2 | Извлекаемая строка отсутствует. |
Наконец, CURSOR_STATUS. Эта функция имеет следующий синтаксис:
CURSOR_STATUS(тип, курсор_или_переменная)
Тип может иметь значения 'local', 'global' или 'variable', а курсор_или_переменная – это идентификатор курсора или курсорной переменной, информацию о котором требуется получить. Результаты, возвращаемые функцией CURSOR_STATUS, представлены в таблице 27.3.
| Возвращаемое значение | Описание |
|---|---|
| 1 | Если функция вызывалась для |
| 0 | Множество курсора пусто. |
| -1 | Курсор закрыт. |
| -2 | Возвращается только для курсорной переменной. Либо курсор, назначенный указанной переменной, закрыт, либо переменной не назначен какой-либо курсор. |
| -3 | Указанный курсор или курсорная переменная не существует. |
Используйте функции мониторинга курсором
в панели инструмента анализатора запросов Query 

в панели инструментов анализатора запросов Query | Чтобы ... | Синтаксис оператора SQL |
|---|---|
| Создать курсор | DECLARE имя_курсора CURSOR [видимость] [прокрутка] [тип] [блокировка] [TYPE_WARNING] FOR оператор_выборки [FOR UPDATE [OF имена_столбцов]] |
| Открыть курсор | OPEN [GLOBAL] курсор_или_переменная |
| Закрыть курсор | CLOSE [GLOBAL] курсор_или_переменная |
| Освободить курсор | |
Использовать простую команду |
|
| Извлечь строку с записью ее в переменные | |
| Осуществить выборку строки по ее абсолютной позиции | |
| Осуществить выборку строки по ее относительной позиции | |
| Выполнить позиционное обновление | UPDATE таблица_или_представление SET список_для_модификации WHERE CURRENT OF курсор_или_переменная |
| Выполнить позиционное удаление | DELETE таблица_или_представление WHERE CURRENT OF курсор_или_переменная |
Использовать функцию CURSOR_STATUS для запроса статуса курсора |
CURSOR_STATUS ('local', 'локальный_курсор') или CURSOR_STATUS ('global', 'глобальный_курсор') или CURSOR_STATUS ('variable', 'курсорная_переменная') |
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.