русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Пакеты.


Дата добавления: 2015-07-09; просмотров: 1315; Нарушение авторских прав


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

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

Использование пакетов является альтернативой созданию процедур и функций как независимых объектов схем. Пакеты имеют преимущества перед независимыми процедурами и функциями:

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



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

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

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

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

Пакеты нельзя вкладывать друг в друга, нельзя вызывать и пакетам нельзя передавать параметры.

Для создания пакета необходимо выполнить два отдельных шага:

1. Создать спецификацию пакета при помощи команды

CREATE PACKAGE. В спецификации пакета можно объявить программные объекты. Такие объекты называются общими (public). К общим объектам можно обращаться как извне пакета, так и из других объектов в пакете.

Заголовок создается следующей структурой:

CREATE [OR REPLACE] PACKAGE имя {IS|AS}

--описания общедоступных типов и объектов;

--спецификация общедоступных функций и процедур;

END [имя];

Если какие-то объекты пакета ссылаются на другие объекты того же пакета, то последние должны быть объявлены раньше, чем ссылка на эти объекты.

2. Создать тело пакета при помощи команды CREATE PACKAGE BODY.

В теле пакета можно объявить и определить программные объекты:

1) Необходимо определить общие объекты, которые были объявлены в спецификации пакета.

2) Необходимо также объявить и определить дополнительные объекты пакета. Такие объекты называются личными (private). Так как личные объекты объявляются в теле пакета, а не в его спецификации, к ним можно обращаться только из других объектов в пакете. Личные объекты недоступны извне пакета.

Заголовок создается следующей структурой:

CREATE [OR REPLACE] PACKAGE BODY имя {IS|AS}

--описания закрытых типов и объектов;

--описания локальных функций и процедур;

--определение общедоступных функций и процедур;

END [имя];

Для обращения к процедуре или функции пакета необходимо указать имя пакета.имя_процедуры (или имя_ункции). При вызове функций и процедур пакета список параметров подчиняется всем тем условиям, которым подчиняется список параметров обычных функций и процедур.

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

1) Нельзя переопределять две подпрограммы, если их параметры отличаются именами или видами:

function A1(A1 NUMBER) и еще объявить function A1(K1 NUMBER)

2) Запрещается перегружать функции, если данные типы параметров относятся к одному семейству.

3) Нельзя переопределять функции, если они отличаются типом возвращаемых параметров.

Пример.

Создать пакет, реализующий прием на работу и увольнение сотрудника.

CREATE OR REPLACE PACKAGE emp_actions IS

CURSOR desc_emp (emp_id emp.empno%TYPE)

RETURN career%ROWTYPE;

PROCEDURE hire_employee (aEname emp.empname%TYPE,

aBirthdate DATE,

aJobno job.jobno%TYPE,

aDeptno emp.empno%TYPE);

PROCEDURE fire_out_employee (aEmpno emp.empno%TYPE);

END emp_actions;

CREATE OR REPLACE PACKAGE BODY emp_actions IS

CURSOR desc_emp (emp_id emp.empno%TYPE)

RETURN career%ROWTYPE IS

(select * from career where empno=emp_id and enddate is null);

 

PROCEDURE hire_employee (aEname emp.empname%TYPE,

aBirthdate DATE,

aJobno job.jobno%TYPE,

aDeptno emp.empno%TYPE) IS

BEGIN

INSERT INTO emp(empno, empname, birthdate)

VALUES (empno_seq.NEXTVAL, aEname, aBirthdate);

IF NOT aJobno IS NULL THEN

INSERT INTO career(empno, jobno, deptno, startdate)

VALUES (empno_seq.CURRVAL, aJobno, aDeptno, sysdate);

END IF;

END hire_employee;

 

PROCEDURE fire_out_employee (aEmpno emp.empno%TYPE) IS

BEGIN

FOR cEmp IN desc_emp(aEmpno) LOOP

UPDATE career SET enddate=sysdate

WHERE empno=aEmpno and enddate IS NULL;

END LOOP;

END fire_out_employee;

END emp_actions;

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

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

 



<== предыдущая лекция | следующая лекция ==>
Хранимые процедуры и функции. | Объекты.


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.73 сек.