- •1. Основные понятия баз данных. Этапы развития субд. Функции, требования к субд.
- •2. Архитектура баз данных. Логическая и физическая независимость данных. Схема прохождения запросов к бд. Классификация моделей данных. Архитектура и модели "клиент-сервер" в технологии бд.
- •3. Реляционная модель бд, ее основные достоинства. Таблица, кортеж, атрибут, домен, первичный ключ, внешний ключ. Фундаментальные свойства отношений. Обеспечение целостности данных.
- •4. Основы реляционной алгебры. Операторы реляционной алгебры. Понятия полной, транзитивной, функциональной зависимостей. Нормализация, третья нормальная форма, шаги нормализации.
- •5. Модель «объект-свойство-отношение», er-диаграммы, проектирование схемы баз данных.
- •6. Язык sql, его структура, стандарты, история развития. Подмножество языка dml: операторы select, insert, update, delete.
- •7. Подмножество языка ddl: операторы create, alter, drop. Представления, их значение; обновляемые представления.
- •8. Подмножество языка dcl: операторы grant, revoke. Системные привилегии, привилегии на объекты, роли.
- •9. Транзакции, операторы управления транзакциями: commit, rollback, savepoint; журнал транзакций, уровни блокировок.
- •10. Pl/sql, структура, основные операторы.
- •11. Курсоры, операторы работы с курсором, оператор select into.
- •12. Процедуры, функции, пакеты.
- •13. Триггеры, их основные свойства и значение.
- •14. Параллельные архитектуры бд; масштабируемость, надежность, производительность.
- •15. Распределенные базы данных, фрагментация, тиражирование.
- •16. Средства защиты данных в субд.
- •17. Шлюзы к базам данных. Архитектура odbc. Www-интерфейс к бд.
- •18. Объектная модель данных.
- •19. Объектно-ориентированные и объектно-реляционные бд.
- •20. Эволюция технологий и возможностей субд oracle (oracle 8i, oracle 9i, oracle 10g).
- •21. Перспективы развития бд.
12. Процедуры, функции, пакеты.
Процедуры — набор инструкций, написанных на языке PL/SQL, и операторов DML. Вызов процедуры приводит к выполнению содержащихся в ней инструкций. Процедуры хранятся в БД.
Процедура — именованный блок PL/SQL, т. е. секция заголовка непустая. Секция заголовка включает в себя имя процедуры и описание ее входных и выходных данных. После спецификации идет секция объявлений, тело процедуры (выполняемая) и секция исключений.
Создается процедура при помощи оператора Create Procedure или Create or Replace Procedure.
Между именем параметра и его типом можно указывать два специальных слова — in и/или out. Указание in будет означать, что переменной было передано входное значение. Указание out означает, что эту переменную можно использовать для возврата значения. Можно указать одновременно оба. Если ничего не указано, подразумевается in.
Процедура выз. оператором execute или exec. #:
execute increase_prices(5);
Если процедуре не передается входной параметр, при вып. процедуры он приравняется знач. по умолчанию.
Процедуру можно вызывать внутри других блоков.
Удаление: Drop Procedure <имя_процедуры>.
Функции отличаются от процедур тем, что должны возвращать значение. В остальном, функция создается по тем же правилам, что и процедура. Синтаксически это отличие отражено в спецификации функции — присутствует служебное слово Return, после которого указывается тип возвращаемого значения.
Как уже было отмечено выше, функции, в отличие от процедур, не могут вызываться при помощи оператора execute, они всегда являются частью более сложного SQL-оператора. #:
Exec increase_prices(get_max_price/100);
Однако, для проверки функции исп. выражение:
Select get_max_price from dual;
Удаление: Drop Function <имя_функции>;
Обычно, если возвращается несколько значений, используется процедура, если одно — функция.
Пакеты нужны для совместного хранения функций, процедур, переменных и курсоров.
Пакет также имеет спецификацию и тело, однако они создаются отдельно друг от друга.
Тело и спецификация пакета разделены, т. к. пользователи не обязаны знать все детали реализации, поэтому они скрываются внутри тела (инкапсуляция). Тело хранится, компилируется и обрабатывается внутри БД и невидимо пользователям. Для программирования своих задач им просто следует пользоваться спецификацией. Важно, для защиты кода.
Вызов процедуры, переменной или функции пакета:
exec <имя_пакета>.<объект_пакета>;
Создание спецификации пакета:
Create Package <имя_пакета> is
[<объявления_переменных>]
[<спецификации_курсоров>] [<спецификации_функций_и_процедур>] End [<имя_пакета>];
Все переменные и типы, объявленные в спецификации пакета, доступны его пользователям. Спецификация позволяет узнать, что содержит пакет.
Переменные в спецификации пакета — переменные пакета (package variables), инициализируются только при первом обращении к нему. Когда производится вызов какой-либо составляющей пакета, Oracle загружает пакет в память, где он остается все время, пока пользователь соединен с БД. При наличии нескольких сеансов переменные пакета и их значения становятся разделяемыми. Обращение к объектам пакета в последующих сеансах происходит быстрее, поскольку пакет уже присутствует в памяти сервера.
Создание тела пакета:
Create or Replace Package Body <имя_пакета> is
[<локальные_переменные>] [<полные_спецификации_курсоров_пакета>] [<полные_спецификации функций_и_процедур_пакета>] Begin [<выполняемые_операторы>]
[Exception [<обработчики_исключений>]]
End [<имя_пакета>];
Выполнение этой секции производится один раз при загрузке пакета, поэтому ее не стоит использовать для каких-либо повторяющихся действий, т. к. обратиться к ней более одного раза все равно не удастся.
В приведенном ниже примере будет создан пакет, в котором собраны функции и процедуры, связанные с объектом менеджер. Далее будут приведены пояснения и комментарии к этому примеру.
Create or Replace PackManager as
pCount Number; — Текущее кол-во менеджеров.
Procedure DeleteManager(Man_ID Number); — Процедура удаления менеджера.
End PackManager;
Create or Replace Package Body PackManager as
Procedure DeleteManager(man_id number)
is
mcount Number;
Begin
Select Manager_ID into mcount from Managers Where Manager_ID=Man_ID;
Delete from Outgoing Where Manager_ID=Man_ID;
Delete from Incoming Where Manager_ID=Man_ID;
Delete from Managers Where Manager_ID=Man_ID;
Exception
When no_data_found Then
Raise_application_error(-20001, 'Manager dont found');
End;
Function mCount — Функция возвращения общего кол-ва менеджеров (видна только внутри пакета).
Return Number
is
m Number;
Begin
Select count(*) into m from Managers;
Return m;
End;
Begin — При инициализации пакета в переменную pCount помещается текущее число менеджеров.
pCount := mCount;
End;