вторник, 15 января 2013 г.

Пакеты в Oracle

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

Пакет состоит из двух компонентов:
- спецификации
- тела

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

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

Создание спецификации пакета:

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;

Комментариев нет:

Отправить комментарий