Oracle package包头和package body包体例子

6 篇文章 0 订阅

本文系转载,原文地址:http://blog.itpub.net/26435490/viewspace-1078212/

一 包的组成

    • 包头(package):包头部分申明包内数据类型,常量,变量,游标,子程序和异常错误处理,这些元素为包的公有元素。
    • 包主体(package body):包主体则是包定义部分的具体实现,它负责为包头中所声明子程序提供具体的实现,在包主体中还可以声明包的私有元素。
    • 包头和包主体分开编译,并作为两个分开的对象分别存放在数据库字典中。


二  包的语法规则

包头的语法如下:

create or replace package 包名
As | IS
          procedure 过程名();
          Function 函数名() return 数据类型;
           变量定义;
          异常定义;
          光标定义;
          ...........
          ...........
End 包名;

包体创建 的语法:

create or replace Package Body 包名
As | IS
            Procedure 过程定义;
            Procedure 过程定义;
             Function 函数定义;
            Function 函数定义;
                .........;

end 包名;

三 包的应用与举例

下面是student 和SC表的定义:

CREATE TABLE Student
       (Sno CHAR(9) PRIMARY KEY,
        Sname CHAR(20) NOT NULL, 
        Ssex CHAR(4),
        Sage SMALLINT,
        Sdept CHAR(20)) tablespace starivespace;


CREATE TABLE SC
         (Sno CHAR(9) NOT NULL,
          Cno CHAR(6) NOT NULL, 
          Grade SMALLINT,
          PRIMARY KEY (Sno,Cno),
          constraint f1 FOREIGN KEY (Sno) REFERENCES Student(Sno),
          FOREIGN KEY (Cno) REFERENCES Course(Cno)
      ) tablespace starivespace

实例:定义一个包,实现如果功能: 输入学号,分别返回该学生的所在系和相应的选课成绩(如果有多门成绩,那么就输出多门成绩)。

定义包头

  1. create or replace
      package sdept_or_grade as
       procedure print_sdept(psno char);
       procedure print_grade(psno char);
       end;
       /
    



  2. 程序包已创建。

创建包体

create or replace
package body sdept_or_grade 
as
procedure print_sdept(psno char) as
    psdept student.sdept%type;
begin
     select sdept into psdept
    from student
    where sno=psno;
    dbms_output.put_line(psdept);
    exception
    when no_data_found then
        dbms_output.put_line(\'Invalid student number\');
end;
procedure print_grade(psno char) as
    pgrade SC.grade%type;
cursor printgrade is select grade into pgrade
    from sc
    where sno=psno;

begin
    open printgrade;
   loop
    fetch printgrade into pgrade;
        dbms_output.put_line(pgrade);
exit when printgrade%notfound;
end loop;
close printgrade;
exception
    when no_data_found then
        dbms_output.put_line(\'Invalid student number\');
end;
end;
/

程序包体已创建。

获取结果

SQL> set serveroutput on;
SQL>
SQL> execute sdept_or_grade.print_sdept(\'0201\');
cs

PL/SQL 过程已成功完成。

SQL>
SQL> execute sdept_or_grade.print_grade(\'0201\');
89
64
50
50

PL/SQL 过程已成功完成。

四  心得体会


从以上例子,和以往在实际应用中额经验,对包的优点总结如下:


第一  包可以简化应用程序设计:程序包的说明部分和包体部分可以分别创建各编译。体现在以下三个方面:

1)        在设计一个应用程序,只创建各编译程序包的说明部分,然后再编写引用该程序包的PL/SQL块。

2)        当完成整个应用程序的整体框架后,再回头来定义包体部分。只要不改变包的说明部分,就可以单独调试、增加或替换包体的内容,这不会影响其他的应用程序。

3)        更新包的说明后必须重新编译引用包的应用程序,但更新包体,则不需重新编译引用包的应用程序,以快速进行应用程序的原形开发。

第二   模块化:可将逻辑相关的PL/SQL块或元素等组织在一起,用名称来唯一标识程序包。把一个大的功能模块划分人适当个数小的功能模块,分别完成各自的功能。这样组织的程序包都易于编写,易于理解更易于管理。

第三     效率高:程序包在应用程序第一次调用程序包中的某个元素时,ORACLE将把整个程序包加载到内存中,当再次访问程序包中的元素时,将直接从内在中读取,而不需要进行磁盘I/O操作而影响速度,同时位于内在中的程序包可被同一会话期间的其它应用程序共享。因此,程序包增加了重用性并改善了多用户、多应用程序环境的效率。
最后   还有提到一点: 信息隐藏。因为包中的元素可以分为公有元素和私有元素。公有元素可被程序包内的过程、函数等的访问,还可以被包外的PL/SQL访问。但对于私有元素只能被包内的过程、函数等访问。对于用户,只需知道包的说明,不用了解包休的具体细节(由于时间关系,明天继续贴出“信息隐藏”的相关例子)。

补充说明:包头和包体可以以java的接口来理解,包头像java的接口,包体像java接口的实现类。
  • 8
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值