Процедуры и функции можно группировать в пакеты.
Пакеты инкапсулируют связанные функциональности в один автономный модуль.
Пакет состоит из двух компонентов:
- спецификации
- тела
Спецификация перечисляет все имеющиеся в пакете процедуры, функции, типы и объекты.
Можно сделать их доступными для всех пользователей у которых есть доступ к пакету.
Самого кода процедур и функций спецификация не содержит.
Тело пакета содержит сам код процедур и функций объявленных в спецификации.
Любая процедура или функция, содержащаяся в теле пакета и не упомянутая в спецификации,
будет доступна только внутри тела пакета (скрыта от внешнего мира).
Создание спецификации пакета:
create [or replace] package имя_пакета
{is | as}
спецификация_пакета
end имя_пакета;
Пример создания спецификации пакета:
create package my_package as
TYPE t_cur IS REF CURSOR;
FUNCTION get_val RETURN t_cur;
procedure update_tab_col(
par1 in tab.col1%type,
par2 in number
);
end my_package;
/
Создание тела пакета:
create [or replace] package body имя_пакета
{is | as}
тело_пакета
end имя_пакета;
Пример создания тела пакета:
create package body my_package as
FUNCTION get_val RETURN t_cur IS
cur t_cur;
BEGIN
OPEN cur FOR
SELECT col1, col2, col3 FROM tab;
return cur;
END get_val;
PROCEDURE update_tab_col(
par1 in tab.col1%type,
par2 in number
) as
var1 integer;
BEGIN
select count(*)
into var1
from tab
where col1 = par1;
if var1 = 1 then
update tab
set col2 = col2 * par2
where col1 = par1;
commit;
end if;
exception
when others then
rollback;
END update_tab_col;
end my_package;
/
Вызов процедур и функций в пакете:
select my_package.get_val from dual;
call my_package.update_tab_col(7, 1.5);
Получить информацию о процедуре или функции из пакета можно так:
select * from user_procedures where object_name = 'MY_PACKAGE';
Удаление пакета:
DROP PACKAGE my_package;
Пакеты инкапсулируют связанные функциональности в один автономный модуль.
Пакет состоит из двух компонентов:
- спецификации
- тела
Спецификация перечисляет все имеющиеся в пакете процедуры, функции, типы и объекты.
Можно сделать их доступными для всех пользователей у которых есть доступ к пакету.
Самого кода процедур и функций спецификация не содержит.
Тело пакета содержит сам код процедур и функций объявленных в спецификации.
Любая процедура или функция, содержащаяся в теле пакета и не упомянутая в спецификации,
будет доступна только внутри тела пакета (скрыта от внешнего мира).
Создание спецификации пакета:
create [or replace] package имя_пакета
{is | as}
спецификация_пакета
end имя_пакета;
Пример создания спецификации пакета:
create package my_package as
TYPE t_cur IS REF CURSOR;
FUNCTION get_val RETURN t_cur;
procedure update_tab_col(
par1 in tab.col1%type,
par2 in number
);
end my_package;
/
Создание тела пакета:
create [or replace] package body имя_пакета
{is | as}
тело_пакета
end имя_пакета;
Пример создания тела пакета:
create package body my_package as
FUNCTION get_val RETURN t_cur IS
cur t_cur;
BEGIN
OPEN cur FOR
SELECT col1, col2, col3 FROM tab;
return cur;
END get_val;
PROCEDURE update_tab_col(
par1 in tab.col1%type,
par2 in number
) as
var1 integer;
BEGIN
select count(*)
into var1
from tab
where col1 = par1;
if var1 = 1 then
update tab
set col2 = col2 * par2
where col1 = par1;
commit;
end if;
exception
when others then
rollback;
END update_tab_col;
end my_package;
/
Вызов процедур и функций в пакете:
select my_package.get_val from dual;
call my_package.update_tab_col(7, 1.5);
Получить информацию о процедуре или функции из пакета можно так:
select * from user_procedures where object_name = 'MY_PACKAGE';
Удаление пакета:
DROP PACKAGE my_package;