Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лекции / Л-5 - Процедурные расширения SQL

.pdf
Скачиваний:
13
Добавлен:
28.06.2021
Размер:
592.42 Кб
Скачать

Курсор (1)

Отличие SQL от процедурных ЯП – операции произ-

водятся одновременно с данными всех строк таблицы (процедурные ЯП обрабатывают данные построчно).

Запрос к РБД обычно возвращает несколько записей данных, но приложение за один раз обрабатывает одну запись.

Курсоры в SQL позволяют выводить, обновлять, удалять выбранную строку в один прием, упрощая совместное использование SQL с другими ЯП.

Курсор (2)

Курсор (CURrent Set Of Records) – это специальная программная конструкция, позволяющая создавать именованную рабочую область для данных, извлекаемых из таблицы.

К сохраненной информации доступ осуществляется

последовательно.

Курсор подобен указателю на конкретную строку

таблицы. Позволяет вывести, обновить или удалить строку, на которую ссылается.

Причины появления курсоров

Инструкции DML работают с множеством в целом («либо все, либо ничего»).

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

После этого потребуется исправить ошибку и заново выполнить инструкцию.

Курсоры специально создавались для разрешения подобных ситуаций, обрабатывая строки одну за одной.

Курсоры в SQL

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

С помощью SQL можно извлекать строки, однако для принятия решений на основе содержимого полей лучше использовать процедурные ЯП.

Курсоры позволяют SQL извлекать строки из таблицы

по одной и передавать их в процедурный код для обработки. Поместив код SQL в цикл, можно, строка за строкой, обработать всю таблицу.

Преимущества курсоров

Код с курсорами, циклами и условными операторами может сгенерировать предупреждение, сохранить обновления ошибочной строки в отдельной таблице, после чего продолжить обработку таблицы.

Гибкость подтверждения и отката операций (подтверждение после обработки каждой строки) – экономия системной памяти и детализированное управление процессом.

Использование условной логики и вычисление значений перед использованием их в инструкциях DML.

Обновление множества таблиц одними значениями.

Основные операции при работе с курсором

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

2.Открытие курсора.

3.Чтение из курсора.

4.Закрытие курсора.

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

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

DECLARE имя_курсора CURSOR [ LOCAL | GLOBAL ]

[ FORWARD_ONLY | SCROLL ]

[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]

[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]

FOR команда_select

[ FOR UPDATE [ OF список_столбцов ] ]

Опции команды создания курсора (1)

LOCAL – локальный курсор (видим в пределах пакета, хранимой процедуры или пользовательской функции);

GLOBAL – глобальный курсор, существующий до закрытия соединения (в текущем соединении можно ссылаться на него из любого модуля);

FORWARD_ONLY – последовательный курсор (выборку данных можно осуществлять только в направлении от первой строки к последней);

SCROLL – прокручиваемый курсор (можно обращаться к нему в любом порядке и направлении);

Опции команды создания курсора (2)

STATIC – статический курсор (содержимое курсора формируется один раз и далее не обновляется);

KEYSET – ключевой курсор (набор ключей, идентифицирующих строки полного результирующего набора курсора);

DYNAMIC – динамический курсор (каждый раз при обращении к нему, происходит выборка из таблиц);

FAST_FORWARD – курсор «только дли чтения» (оптимизирован для быстрого доступа к данным).

Опции команды создания курсора

SCROLL_LOCKS – обновления и удаления, производимые над строками курсора, будут гарантированно успешны. Не совместима с опцией FAST_FORWARD;

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

команда_select – стандартный запрос на выборку;

список_столбцов – указываются обновляемые столбцы курсора. Если конструкция без столбцов, то разрешено обновлять все столбцы (если нет опции READ_ONLY).