oracle 包 Package 的学习

包 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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值