oracle 包 Package 的学习

来源:互联网 发布:知世超级超级超级犀利 编辑:程序博客网 时间:2024/05/16 03:44
包 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 employeis--变量名employe 不能和 表名 employe 一样--employe emp%rowtype;--显示雇员信息--procedure show_detailasbeginDBMS_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)asbeginselect * into employe from emp where empno=p_empno;DBMS_OUTPUT.PUT_LINE('获取 '||employe.ename||' 信息成功');exceptionwhen others thenDBMS_OUTPUT.PUT_LINE('获取雇员信息 发生错误!');end get_employe;end employe;</span>
参考文献:
http://wenku.baidu.com/link?url=N0Bjk_6QpK7iAjJ6LApjK32nYX-wfAIXFOAoZa0bi0UKZxkjnvxDY1ipqP8eW6_32nqtTQy6ZbWAsy53_1ZbcsE2JIefuFUUhdWFGXdq3Cq



0 0
原创粉丝点击