Лекции / Л-5 - Процедурные расширения SQL
.pdfКурсор (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).