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

Хранимые подпрограммы

Подпрограммы хранятся в откомпилированном виде, что снижает время доступа к ним.

Синтаксис, используемый при написании хранимых подпро­грамм, очень похож на синтаксис, применяемый в неименованных блоках PS/SQL при определении подпрограмм:

CREATE [OR REPLACE] PROCEDURE [имясхемы.]имяпроцедуры

[(параметр [, параметр]…)] IS

[локальныеобъявления]

BEGIN

исполняемыеутверждения

[EXCEPTION

обработчикиисключений ]

END [имяпроцедуры];

Для функций действует аналогичное объявление.

Перед выполнением хранимой подпрограммы ORACLE устанавливает неявную точку сохранения. Если подпрограмма сбивается в результате необработанного исключения, ORACLE осуществляет откат к этой точке сохранения. Тем самым отменяется вся работа, проделанная подпрограммой.

К сожалению, хранение подпрограмм в откомпилированном виде имеет и свои недостатки. Так, после модификации структуры объектов базы данных, на которые имеются ссылки в хранимых подпрограммах, их использование становится опасным. С другой стороны, автоматическое внесение изменений в программы невозможно. Для того чтобы как-то проконтролировать этот процесс, вводится понятие действительности хранимых подпрограмм.

Хранимая подпрограмма всегда находится в одном из двух состояний: действительном (valid) или недействительной (invalid). Подпрограмма действительна, если ни ее исходный код, ни любой из объектов, к которым она обращается, не был ни удален (DROP), ни заменен (REPLACE), ни изменен (ALTER) с момента последней компиляции этой подпрограммы. В противном случае программа считается недействительной.

Хранимая подпрограмма, обращающаяся к объекту базы данных, называется зависимой от этого объекта. Oracle помечает как недействительную любую подпрограмму, зависящую от удаляемого, заменяемого или изменяемого объекта, в момент этой операции над объектом.

Недействительная подпрограмма должна быть перекомпилирована перед исполнением. Эта перекомпиляция осуществляется в два этапа. Сначала Oracle определяет, нет ли недействительных подпрограмм или пакетов среди тех, к которым обращается данная подпрограмма. Если есть, они должны быть также перекомпилированы. Это может привести к каскаду перекомпиляций, которые должны быть все успешными; в противном случае Oracle возвращает ошибку выполнения, а подпрограмма остается недействительной. На втором этапе перекомпилируется сама требуемая подпрограмма, после чего она может быть исполнена.

Проверить состояние хранимых процедур или функций можно, выполнив запрос

SELECT object_name, object_type, status

FROM user_objects

WHERE object_type IN(’FUNCTION’, ’PROCEDURE’)

ORDER BY object_name, object_type;

Если поле status получит значение 'INVALID’, соответствующую подпрограмму можно попытаться перекомпилировать с помощью команды

ALTER [FUNCTION | PROCEDURE ] имяподпрограммы COMPILE;

Пакеты

Пакет – это набор программных объектов, хранимых в базе данных и использующих общие данные, курсоры и другие объекты. При ссылке на какой либо объект пакета он целиком загружается в память и становится доступным всем пользователям. Пакет состоит из двух частей: спецификации, или заголовка (package) и тела (package body). Спецификация пакета описывает его интерфейс, т.е., языковые конструкции, которые доступны всем пользователям пакета. Тело пакета полностью определяет курсоры и подпрограммы, тем самым реализуя спецификацию пакета. Кроме того, в тело пакета могут входить личные, или закрытые описания и подпрограммы, которые можно использовать только в подпрограммах, входящих в тело пакета.

Пакеты предлагают несколько преимуществ:

Модульность. Пакеты позволяют вам инкапсулировать логически связанные типы, объекты и подпрограммы в поименованный модуль PL/SQL. Каждый пакет легко понять, а интерфейсы между пакетами просты, ясны и хорошо определены. Это облегчает разработку приложений.

Облегчение проектирования. Все, что знать при проектировании приложения - это информация интерфейса для спецификации пакета. Вы можете кодировать и компилировать спецификацию пакета без его тела. После того, как спецификация пакета откомпилирована, хранимые подпрограммы, обращающиеся к этому пакету, также могут быть откомпилированы (но выполнять их можно только после компиляции тела пакета!). Вы не обязаны полностью определять тела пакетов до тех пор, пока не будете готовы к реализации деталей приложения.

Скрытие информации. С помощью пакетов вы можете указывать, какие типы, объекты и подпрограммы являются общими (видимыми и доступными) или личными (скрытыми и недоступными). Например, если пакет содержит четыре подпрограммы, то три из них могут быть общими, а одна личной. Пакет скрывает определение личной подпрограммы, так что лишь этот пакет, а не использующие его приложения, будет затронут, если это определение изменится. Это упрощает сопровождение и развитие. Кроме того, скрывая детали реализации от пользователей, вы защищаете целостность вашей базы данных.

Расширенная функциональность. Пакетированные общие переменные и курсоры продолжают существовать в течение всей сессии. Поэтому они могут совместно использоваться всеми процедурами, выполняющимися в данном окружении. Кроме того, через них можно передавать данные между транзакциями без необходимости записывать такие данные в базу данных.

Улучшенная производительность. Когда вы вызываете пакетированную подпрограмму первый раз, в память загружается весь пакет. Поэтому последующие вызовы других подпрограмм этого пакета не требуют операций ввода-вывода.

Помимо этого, пакеты останавливают каскадные зависимости, и тем самым избегают излишних перекомпиляций. Например, когда вы изменяете определение независимой функции, ORACLE должен перекомпилировать все хранимые подпрограммы, которые вызывают эту функцию. Однако когда вы изменяете определение пакетированной функции, перекомпиляция вызывающих подпрограмм не требуется, потому что они не зависят от тела пакета.

Спецификация пакета имеет следующий вид:

CREATE [ OR REPLACE ] PACKAGE [имясхемы.]пакета IS

[типыданных]

[константы]

[переменные]

[спецификациикурсоров]

[спецификацииподпрограмм]

END [имяпакета];

Аналогично, описание тела пакета выполняется так:

CREATE [ OR REPLACE ] PACKAGE BODY [имясхемы.]имяпакета IS

[личныетипыданных]

[личныеконстанты]

[личныепеременные]

[курсоры]

[подпрограммы]

END [имяпакета];

Как и отдельные хранимые подпрограммы, пакеты могут быть действительными или недействительными. Спецификация пакета действительна (valid), если ни ее исходный код, ни любой из объектов, к которым она обращается, не был ни удален (DROP), ни заменен (REPLACE), ни изменен (ALTER) с момента последней компиляции этой спецификации. В противном случае спецификация считается недействительной. Когда Oracle помечает спецификацию пакета как недействительную, он также помечает как недействительные все объекты, обращающиеся к этому пакету.

К телу пакета применяются те же правила, с той разницей, что Oracle может перекомпилировать тело пакета, не помечая его спецификацию как недействительную. Эта возможность позволяет ограничить каскад перекомпиляций, вызываемых зависимостями.

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