
- •АвОсновные понятия баз данных. Этапы развития субд. Функции субд. Требования к системам управления базами данных.
- •Архитектура баз данных. Логическая и физическая независимость данных. Схема прохождения запросов к бд.
- •Классификация моделей данных. Архитектура и модели "клиент-сервер" в технологии бд.
- •Реляционная модель бд, ее основные достоинства. Таблица, кортеж, атрибут, домен, первичный ключ, внешний ключ. Фундаментальные свойства отношений.
- •Обеспечение целостности данных.
- •Основы реляционной алгебры. Операторы реляционной алгебры.
- •6.1. Основы реляционной алгебры
- •6.2. Операторы реляционной алгебры
- •Понятия полной и транзитивной функциональной зависимости. Нормализация, третья нормальная форма, шаги нормализации.
- •7.1. Понятия полной и транзитивной функциональной зависимости
- •7.2. Нормализация, третья нормальная форма, шаги нормализации
- •Модель «объект-свойство-отношение», er-диаграммы, проектирование схемы баз данных.
- •8.1. Модель «объект-свойство-отношение»
- •8.3. Проектирование схемы баз данных
- •Язык sql, его структура, стандарты, история развития. Подмножество языка dml: операторы select, insert, update, delete.
- •Структура языка sql
- •Вставка множества записей
- •Оператор изменения значений полей update
- •Оператор удаления строк delete
- •Подмножество языка ddl: операторы create, alter, drop. Представления, их значение; обновляемые представления.
- •10.1. Подмножество языка ddl: операторы create, alter, drop Оператор create - создание таблицы.
- •Создание внешнего ключа
- •Оператор drop
- •10.2. Представления, их значение; обновляемые представления
- •Создание и удаление представлений
- •Обновляемые представления
- •Подмножество языка dcl: операторы grant, revoke. Системные привилегии, привилегии на объекты, роли.
- •Объектные и системные привилегии
- •Операторы grant и revoke
- •Транзакции, операторы управления транзакциями: commit, rollback, savepoint; журнал транзакций, уровни блокировок.
- •Операторы управления транзакциями
- •Журналы транзакций
- •Язык pl/sql, его структура, основные операторы.
- •Курсоры, явные и неявные курсоры, операторы работы с курсором, оператор select into.
- •Процедуры, функции, пакеты.
- •Триггеры, их основные свойства и значение.
- •Параллельные архитектуры бд; масштабируемость, надежность, производительность.
- •Распределенные базы данных, фрагментация, тиражирование.
- •Средства защиты данных в субд.
- •Шлюзы к базам данных. Архитектура odbc. Www-интерфейс к бд.
- •Объектная модель данных
- •Объектно-ориентированные, объектно-реляционные бд, универсальные бд
- •Эволюция технологий и возможностей субд oracle (oracle 8i, oracle 9i, oracle 10g).
- •Роль grid-технологий в организации хранения и обработки данных. Перспективы развития технологий баз данных.
Курсоры, явные и неявные курсоры, операторы работы с курсором, оператор select into.
В зависимости от числа возвращаемых запросом строк используются два метода.
SELECT … INTO … - когда возвращается 1 строка
BEGIN
SELECT id, customerid, orderdate
INTO currentorder.id, currentorder.customerid,
currentorder.orderdate
FROM orders
WHERE id=453;
Если по запросу возвращаются несколько строк, нужно воспользоваться курсором.
Курсор - это указатель на набор записей, полученный в результате выполнения связанного с ним оператора SELECT. Назначение: выполнение и обработка запросов, возвращающих более одной строки.
В одних случаях курсоры объявляются явно, а других программист предоставляет PL/SQL самому выполнить эту операцию.
Курсор, как и переменная, объявляется в секции объявлений базового блока. Синтаксис объявления курсора следующий:
CURSOR имя_курсора [(параметр_1 [, параметр_2, ...])]
[RETURN спецификация_возврата]
IS
оператор_SELECT
[FOR UPDATE
[OF таблица_или_столбец_1
[, таблица_или_столбец_2, ...]
]
]
Параметры курсора являются входными (IN). Значения переданных параметров могут использоваться в разделе WHERE связанного с курсором оператора SELECT.
Явное объявление курсора производится в секции DECLARE, причем указанный в определении SQL-оператор может содержать команды select.
Команды insert, update или delete здесь не допускаются. Явные курсоры используются для обработки тех операторов, которые возвращают более одной строки.
Для обработки явного курсора в PL/SQL необходимо выполнить 4 шага:
объявление курсора
открытик курсора оператором OPEN
выборка данных оператором FETCH
закрытие курсора оператором CLOSE
Использование команд OPEN, FETCH и CLOSE
В момент открытия оператором OPEN курсор выполняет связанный с ним оператор SELECT. Если оператор SELECT возвращает непустой набор записей курсор автоматически указывает на первую выбранную строку.
Каждая команда FETCH перемещает данные из курсора в указанные переменные, после чего перемещает указатель на следующую запись в наборе записей, возвращенным оператором SELECT. Если записей больше нет, указатель все время будет указывать на последню запись, а атрибуты курсора %FOUND и %NOTFOUND становятся равными, соответственно, FALSE и TRUE.
При выполнении оператора CLOSE курсор закрывается. При этом освобождаются все ресурсы, занятые во время открытия курсора.
Атрибуты курсора:
Курсор имеет ряд индикаторов, показывающих его состояние. Они называются атрибутами курсора.
Атрибут |
Описание |
имя_курсора%ISOPEN |
Позволяет проверить, открыт ли курсор. Если курсор имя_курсора уже открыт, возвращается значение TRUE. |
имя_курсора%ROWCOUNT |
Порядковый номер строки в наборе данных, на которую указывает курсор. |
имя_курсора%FOUND |
Позволяет проверить, была ли успешной последняя попытка получения записи из курсора. Если запись была выбрана, возвращается значение TRUE. |
имя_курсора%NOTFOUND |
Противоположен атрибуту FOUND. Если записей больше не найдено, возвращает значение TRUE. |
Перед тем, как попытаться выбрать из курсора очередные данные, следует проверить состояние атрибутов %FOUND или %NOTFOUND.
Неявно объявляемые курсоры
Оператор select указывается в теле блока, и PL/SQL берет на себя всю заботу об определении курсора, выполняя соответствующие действия неявно. При этом программисту не требуется вносить в секцию DECLARE никаких дополнительных объявлений.
Обработка неявных курсоров
Каждый оператор select выполняется в пределах контекстной области и поэтому имеет курсор, указывающий на конкретную контекстную область. Такой курсор называется SQL-курсором. В отличии от явных курсоров SQL-курсор не открывается и не закрывается программой. PL/SQL неявно открывает SQL-курсор, обрабатывает SQL- оператор и в последствии закрывает этот курсор, поэтому команды OPEN, FETCH, CLOSE не нужны.
Неявные курсоры используются для обработки операторов INSERT, UPDATE, DELETE, а также однострочных операторов SELECT…INTO
Фактическая обработка записей из курсора обычно выполняется внутри цикла. При написании такого цикла обычно производится проверка, была ли найдена хотя бы одна запись. Если да, то можно продолжить обработку этой записи; в противном случае следует выйти из цикла. Пример:
set serveroutput on
DECLARE
-- объявление курсора
CURSOR showmanagers IS
select * from managers;
-- объявление временной переменной для хранения текущей строки курсора
m managers%ROWTYPE;
BEGIN
-- открытие курсора
OPEN showmanagers;
-- выборка первой записи
FETCH showmanagers INTO m;
-- продолжать цикл до тех пор, пока курсор указывает на необработанную запись
WHILE showmanagers%FOUND LOOP
dbms_output.put_line(to_char(showmanagers%ROWCOUNT)||` `||m.name);
-- выбрать следующую запись
FETCH showmanagers INTO m;
END LOOP;
END;
/
Приведенный пример выводит на экран пронумерованный список имен менеджеров.
Курсорный цикл FOR
Приведенный выше пример можно реализовать другим, более кратким путем, используя курсорный цикл FOR. При этом PL/SQL будет осуществлять открытие, выборку и закрытие курсора без вашего участия.
Синтаксис курсорного цикла FOR имеет следующий вид:
FOR запись_курсора IN имя_курсора[(параметр_1 [, параметр_2 ...])] LOOP
операторы;
END LOOP;
Этот цикл выбирает записи из курсора в переменную типа запись_курсора. Поля записи_курсора можно использовать для доступа к данным из операторов PL/SQL, выполняемых в цикле. Когда все записи выбраны, цикл завершается. Для удобства, открытие и закрытие курсора происходит автоматически. Пример:
DECLARE
-- объявление курсора
CURSOR showmanagers IS
select * from managers;
BEGIN
FOR m IN showmanagers LOOP
dbms_output.put_line(to_char(showmanagers%ROWCOUNT)||` `||m.name);
END LOOP;
END;
/
Данный пример делает то же, что и предыдущий, но даже на первый взгляд видно, что он значительно короче и проще. Уже не нужно объявлять переменную для временного хранения текущей строки курсора. Не надо открывать или закрывать курсор.