Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Answers v.0.6.docx
Скачиваний:
6
Добавлен:
26.09.2019
Размер:
244.13 Кб
Скачать

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;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]