Oracle package包头和package body包体例子

一 包的组成

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


 

二  包的语法规则

包头的语法如下:

 
  1. create or replace package 包名

  2. As | IS

  3. procedure 过程名();

  4. Function 函数名() return 数据类型;

  5. 变量定义;

  6. 异常定义;

  7. 光标定义;

  8. ...........

  9. ...........

  10. End 包名;


包体创建的语法:

 

 

 
  1. create or replace Package Body 包名

  2. As | IS

  3. Procedure 过程定义;

  4. Procedure 过程定义;

  5. Function 函数定义;

  6. Function 函数定义;

  7. .........;

  8.  
  9. end 包名;

 

三 包的应用与举例

下面是student 和SC表的定义:

 

 

 
  1. CREATE TABLE Student

  2. (Sno CHAR(9) PRIMARY KEY,

  3. Sname CHAR(20) NOT NULL,

  4. Ssex CHAR(4),

  5. Sage SMALLINT,

  6. Sdept CHAR(20)) tablespace starivespace;

  7.  
  8.  
  9. CREATE TABLE SC

  10. (Sno CHAR(9) NOT NULL,

  11. Cno CHAR(6) NOT NULL,

  12. Grade SMALLINT,

  13. PRIMARY KEY (Sno,Cno),

  14. constraint f1 FOREIGN KEY (Sno) REFERENCES Student(Sno),

  15. FOREIGN KEY (Cno) REFERENCES Course(Cno)

  16. ) tablespace starivespace


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

定义包头:

 

  1.  
    1. create or replace

    2. package sdept_or_grade as

    3. procedure print_sdept(psno char);

    4. procedure print_grade(psno char);

    5. end;

    6. /


     
  2.  
  3. 程序包已创建。

 

创建包体:

 

 
  1. create or replace

  2. package body sdept_or_grade

  3. as

  4. procedure print_sdept(psno char) as

  5. psdept student.sdept%type;

  6. begin

  7. select sdept into psdept

  8. from student

  9. where sno=psno;

  10. dbms_output.put_line(psdept);

  11. exception

  12. when no_data_found then

  13. dbms_output.put_line(\'Invalid student number\');

  14. end;

  15. procedure print_grade(psno char) as

  16. pgrade SC.grade%type;

  17. cursor printgrade is select grade into pgrade

  18. from sc

  19. where sno=psno;

  20.  
  21. begin

  22. open printgrade;

  23. loop

  24. fetch printgrade into pgrade;

  25. dbms_output.put_line(pgrade);

  26. exit when printgrade%notfound;

  27. end loop;

  28. close printgrade;

  29. exception

  30. when no_data_found then

  31. dbms_output.put_line(\'Invalid student number\');

  32. end;

  33. end;

  34. /


程序包体已创建。

获取结果:

 

 
  1. SQL> set serveroutput on;

  2. SQL>

  3. SQL> execute sdept_or_grade.print_sdept(\'0201\');

  4. cs

  5.  
  6. PL/SQL 过程已成功完成。

  7.  
  8. SQL>

  9. SQL> execute sdept_or_grade.print_grade(\'0201\');

  10. 89

  11. 64

  12. 50

  13. 50

  14.  
  15. PL/SQL 过程已成功完成。

 

四  心得体会

 

 

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

 

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

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

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

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

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

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

补充说明:包头和包体可以以java的接口来理解,包头像java的接口,包体像java接口的实现类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值