包 Package:
|-概念:包是用来存储相关程序结构的对象(它存储于数据字典中);
|-组成:包头(package) 和 包体(package body);
|-包头:包的说明部分,对外操作提供的接口,对应用是可见的;

|-包体:包的SQL真正实现部分,对应用是不可见的;


包的结构:
|- procedure  存储过程
|- function  函数
|- variable  变量
|- constant  常量
|- cursor  游标
|- type  类型
|- exception  异常信息

各以上结构 可以出现在三个地方:
|- 在包头中:公有元素;--整个应用访问有效;
|- 在包体中:私有元素;--仅包内部访问有效;
|- 变量出现在包体中的procedure或function中 为局部变量;--仅此过程或函数访问有效;

在包体中出现的Procedure 和 Function 需在包头中预先定义;
包的优点:
|-将 存储过程 和 函数 有组织的组织起来,放在包中,利于外部调用;不同的包之间不会互相
  影响;
|-提高了对 存储过程 和 函数 的访问安全;对非创建此包用户只需授权一次即可;
|-对于同一个用户访问过的变量值,将保留,供下次直接读取;
|-包 一次调用,便在内存贮存,减少了访问次数,减轻数据库压力;

包的创建和执行:

<span style="font-size:18px;">--包头的创建
create or replace package 包名
is
函数1;
函数2;
存储过程1;
存储过程2(param1 TYPE)
...
end 包名;
/--用斜杠来区分 包头 和 包体

--包体的创建
create or replace package body 包名 --包体的 包名 和 包头的 包名 一样的
IS
--声明变量 此变量用来接收表的每条记录
Variable1 表名%rowtype; --注意:变量名(employe) 不能和 表名(emp) 重名

--具体实现 函数1/函数2/存储过程1/存储过程2 我以 Procedure 示例
procedure 存储过程1(param1 TYPE)
as
begin
select * into Variable1 from emp where ename = param1;
exception
when others then
DBMS_OUTPUT.PUT_LINE('获取雇员信息 发生错误!');
end 存储过程1;
end 包名;</span>

 注意:包的编译-->先编译 包头,再编译 包体;

<span style="font-size:18px;">--执行这个包的procedure
EXECUTE 包名.存储过程1(param1);

实例 参考:
procedure get_employe(p_empno number);
end employe;
/
create or replace package body employe
is
--变量名employe 不能和 表名 employe 一样--
employe emp%rowtype;

--显示雇员信息--
procedure show_detail
as
begin
DBMS_OUTPUT.PUT_LINE('---雇员信息---');
DBMS_OUTPUT.PUT_LINE('雇员编号 :'||employe.empno);
DBMS_OUTPUT.PUT_LINE('雇员名称 :'||employe.ename);
DBMS_OUTPUT.PUT_LINE('雇员职务 :'||employe.job);
DBMS_OUTPUT.PUT_LINE('雇员工资 :'||employe.sal);
DBMS_OUTPUT.PUT_LINE('部门编号 :'||employe.deptno);
end show_detail;

--从emp表取得一个雇员--
procedure get_employe(p_empno number)
as
begin
select * into employe from emp where empno=p_empno;
DBMS_OUTPUT.PUT_LINE('获取 '||employe.ename||' 信息成功');
exception
when others then
DBMS_OUTPUT.PUT_LINE('获取雇员信息 发生错误!');
end get_employe;

end employe;
</span>

参考文献:

​ http://wenku.baidu.com/link?url=N0Bjk_6QpK7iAjJ6LApjK32nYX-wfAIXFOAoZa0bi0UKZxkjnvxDY1ipqP8eW6_32nqtTQy6ZbWAsy53_1ZbcsE2JIefuFUUhdWFGXdq3Cq ​