- •Конспект лекций
- •Основные определенИя. Элементы субд.
- •Основные определения.
- •Система управления базами данных (субд)
- •Характеристика различных моделей баз данных.
- •Иерархические модель базы данных
- •1.4. Сетевая модель базы данных
- •Вопросы для самопроверки.
- •Общая характеристика реляционной модели данных
- •Фундаментальные свойства отношений.
- •Состав реляционной бд.
- •Базисные средства манипулирования реляционными данными
- •Элементы реляционной алгебры.
- •Реляционное исчисление.
- •Проектирование реляционных баз данных.
- •Проектирование баз данных на основе модели "Сущность-связь"
- •Элементы модели "сущность-связь"
- •Отображение подтипов в er-модели.
- •Общий порядок разработки модели бд на основе er моделирования.
- •4.1.4. Нормальная форма Бойса - Кодда (bcnf )
- •Механизмы работы с бд.
- •Ограничения
- •Описание ограничений
- •Механизмы реализации прикладной логики
- •Объявление курсора
- •Глобальные переменные работающие с курсорами
- •9.4. Исключения
- •Разработка клиентских приложений на основе архитектуры «Клиент – сервер»
- •Управление транзакции
- •Управление транзакциями (ут)
- •Управление на основе метода блокировок
- •Управление параллелизмов с использованием меток времени
- •Восстановление транзакций
- •Восстановление бд при различных режимах ведения журналов транзакций
- •Объектно-ориентированная модель бд
- •Отображение связей объектов в оом
- •Системы управления распределенными бд (сурбд)
- •Механизмы обеспечения прозрачности транзакций
- •Особенности проектирования распределенных бд
- •Типы пользователей
- •Создание учетных записей пользователей
- •Создание учетных записей пользователей в Sybase и Microsoft sql Server
- •Создание схемы.
- •Привилегии
Объявление курсора
Для объявления курсора используется оператор DECLARE. Он содержит определенное пользователем имя, применяемое для ссылки на результирующий набор данных, а также оператор SQL SELECT, который генерирует этот результирующий набор.
Синтаксис объявления курсора
Приводится синтаксис оператора DECLARE, принятый в стандарте SQL-92:
DECLARE имяКурсора [INSENSITIVE] [SCROLL] CURSOR
FOR операторSELECT
[FOR {READ ONLY | UPDATE [OF списокСтолбцов]}]
В MS SQL SERVER используется расширенный синтаксис оператора:
DECLARE имя_курсора CURSOR [ LOCAL | GLOBAL ] [ FORWARD_ONLY | SCROLL ] [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] [ TYPE_WARNING ] FOR select_statement [ FOR UPDATE [ OF список_столбцов] ]
значения синтаксических элементов, принятых в SQL 92 |
||
Параметр |
Описание |
|
INSENSITIVE |
Указывает, что изменения в источнике данных не будут отражаться в курсоре. При выборе этого параметра обновления курсора не разрешены |
|
SCROLL |
Разрешает использование следующих FETCH-команд: PRIOR, FIRST, LAST, ABSOLUTE л и RELATIVE л |
|
Оператор SELECT |
Оператор SQL SELECT. При использовании следующих команд курсор объявляется как INSENSITIVE: DISTINCT. UNION, GROUP BY и/или HAVING |
|
READ ONLY |
Запрещает обновления курсора |
|
UPDATE [OF список столбцов] |
Разрешает обновления курсора. Необязательное предложение [OF список столбцов] определяет, какие столбцы в курсоре можно обновлять |
|
Расширенный синтаксис оператора объявления курсора. |
||
Параметр |
Описание |
|
FORWARD ONLY |
Указывает, что для навигации курсора будет использоваться только команда FETCH NEXT. Используйте этот параметр для минимизации ресурсов и блокировок курсора |
|
STATIC |
Указывает на то, что модификации курсора запрещены и изменения, внесенные в базовые таблицы после его открытия, не будут отражены в курсоре. Используйте этот параметр в случае, когда курсор предназначен только для чтения, а также для минимизации ресурсов и блокировок курсора |
|
KEYSET |
Указывает на фиксированный порядок членов курсора. При этом в курсоре используются только ключи базовых таблиц. KEYSET-курсор переходит в STATIC-курсор, если базовая таблица (таблицы) не содержит уникальных индексов или первичных ключей |
|
DYNAMIC |
Указывает на то, что изменения, внесенные в базовую таблицу после открытия курсора, будут отражаться в курсоре. Используйте этот параметр для достижения максимальной согласованности данных. Однако следует помнить, что этот параметр требует значительных затрат ресурсов по сравнению с такими типами курсоров, как KEYSET и STATIC |
|
FAST__FORWARD |
Определяет курсор как FORWARD ONLY и READ ONLY. Этот параметр добавлен с целью оптимизации и достижения максимальной производительности |
|
SCROLL LOCKS |
Указывает, что в результирующем наборе курсора, будет использоваться блокировка данных. Блокировка выполняется при чтении данных в курсор. Этот параметр гарантирует, что обновления или удаления строк, связанных с курсором, всегда будут выполнены успешно, поскольку данные заблокированы курсором. Следует избегать применения этого параметра при одновременном доступе к данным курсора со стороны нескольких пользователей |
|
OPTIMISTIC |
Указывает на то, что при чтении в курсор данные не блокируются. Обновления или удаления строк данных. связанных с курсором, могут завершиться неудачей, если данные, лежащие в основе курсора, были изменены после их прочтения в курсор. Этот параметр следует использовать при одновременном доступе к данным курсора со стороны нескольких пользователей |
Примеры объявления курсора:
Пример 1. Стандартный курсор
DECLARE pub_crsr CURSOR
FOR
SELECT pub_id, pub_name
FROM publishers
Пример 2. Курсор, предназначенный только для чтения
DECLARE pub_crsr CURSOR
FOR
SELECT pub_id, pub_name
FROM publishers
FOR READ_ONLY
Пример З. Курсор, допускающий обновления
DECLARE pub_crsr CURSOR
FOR
SELECT pub_id, pub_name
FROM publishers
FOR UPDATE
Открытие курсора
После объявления курсор нужно открыть, то есть оператор OPEN должен следовать за оператором DECLARE.
Синтаксис оператора open
OPEN [GLOBAL] имяКурсора
Пример
OPEN pub_crsr
После открытия курсор инициализируется и его внутренний "указатель" устанавливается таким образом, чтобы курсор давал возможность извлечь первый кортеж отношения.
Выборка данных из курсора
Из открытого курсора можно прочитать данные построчно. Для этого используется оператор FETCH (выталкивания из курсора данные в переменные). В SQL Server предусмотрены курсоры с прокруткой вперед (forward-scrolling cursors) и с прокруткой назад (backward-scrolling cursors).
Синтаксис оператора fetch
FETCH [ [ NEXT | PRIOR | FIRST | LAST | ABSOLUTE { n | @nvar } | RELATIVE { n | @nvar } ]
FROM ] { [ GLOBAL ] имяКурсора } [ INTO @имяПеременной ]
В таблице 2 приведено описание элементов синтаксиса команды FETCH.
Таблица 2.
Описание элементов FETCH
Элемент |
Описание |
NEXT |
Считывает следующую строку |
PRIOR |
Считывает предыдущую строку |
FIRST |
Считывает первую строку |
LAST |
Считывает последнюю строку |
ABSOLUTE n |
Считывает строку с указанным абсолютным номером из результирующего набора |
RELATIVE л |
Считывает строку, номер которой указан относительно текущей позиции внутри результирующего набора |
имя курсора |
Имя открытого курсора |
INTO @имя переменной, @имя переменной и т.д. |
Копирует содержимое столбцов в указанные переменные |
При использовании аргумента absolute или relative величина перемещения в обратном направлении задается с помощью отрицательных чисел. Причем для аргумента absolute строки отсчитываются назад, начиная с последней строки набора записей, а для аргумента relative — начиная с текущей строки набора записей.
Пример 1. Прочитать следующую строку из результирующего набора
FETCH NEXT FROM pub_crsr
Пример 2. Прочитать строку 5 из результирующего набора
FETCH ABSOLUTE 5 FROM pub_crsr
Пример 3. Скопировать содержимое следующей строки в переменные
FETCH NEXT FROM pub_crsr INTO @pub_id, @pub_name
Выборка данных используется в основном вместе с циклом WHILE :
While @@Fetch_status=0 ––выбираем в цикле строки курсора
Begin
Fetch next from pub_crsr ––выбираем следующую строку
End
Закрытие и освобождение курсора
Завершив обработку данных курсора, необходимо закрыть его (с помощью оператора CLOSE) и освободить занимаемые им системные ресурсы (с помощью оператора DEALLOCATE). Оператор CLOSE закрывает курсор, но не освобождает используемые им структуры данных. Применяйте этот оператор, если вы планируете в дальнейшем повторно открывать курсор. Оператор DEALLOCATE закрывает курсор и освобождает структуры используемых им данных.
Синтаксис операторов close и deallocate
CLOSE [GLOBAL] имя_курсopa DEALLOCATE [GLOBAL] имя_курсора
Пример 1. Закрыть курсор
CLOSE pub_crsr
Пример 2. Освободить курсор
DEALLOCATE pub_crsr
Модификация таблиц с помощью курсоров
Помимо считывания информации из курсора, можно выполнять построчное обновление и удаление содержащихся в нем данных. При модификации курсора соответствующие изменения будут автоматически распространяться и на источник данных курсора. Такие действия выполняются позиционными операторами update и delete.
Синтаксис операторов update и delete
UPDATE имяТаблицы
SET имяСтолбца1 = (выражение1 | NULL | (операторSelect)
[, имя_столбца 2 = {выражение2 | NULL | (операторSelect)}…]
WHERE CURRENT OF имяКурсора
В данном случае будет модифицироваться значения атрибутов таблицы имяТаблицы но только у строки, на которую спозиционирован курсор. Служебная переменная CURRENT указывает на текущую запись набора курсора.
Анологично в последующем примере
DELETE FROM имяТаблицы WHERE CURRENT OF имяКурсора
Пример 1. Обновить столбец pub_name в таблице publishers
В данном примере будет выполнено обновление текущей строки в курсоре:
UPDATE publishers
SET pub_name = 'XYZ publisher'
WHERE CURRENT OF pub_crsr
Пример 2. Удалить строку в таблице publishers
В данном примере будет удалена текущая строка в курсоре:
DELETE FROM publishers WHERE CURRENT OF pub_crsr