加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Oracle package包头和package body包体例子

发布时间:2020-12-12 14:24:21 所属栏目:百科 来源:网络整理
导读:一 包的组成 包头(package):包头部分申明包内 数据类型 ,常量,变量,游标,子程序和异常错误处理,这些元素为包的公有元素。 包主体(package body):包主体则是包定义部分的 具体实现 ,它负责为包头中所声明子程序提供具体的实现,在包主体中还可以声明


包的组成

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


二 包的语法规则

包头的语法如下:

[sql] view plain copy
  1. createorreplacepackage包名
  2. As|IS
  3. procedure过程名();
  4. Function函数名()return数据类型;
  5. 变量定义;
  6. 异常定义;
  7. 光标定义;
  8. ...........
  9. ...........
  10. End包名;

包体创建 的语法:

copy
    replacePackageBody包名
  1. Procedure过程定义;
  2. Procedure过程定义;
  3. Function函数定义;
  4. Function函数定义;
  5. .........;
  6. end包名;

三 包的应用与举例

下面是student 和SC表的定义:

copy
    CREATETABLEStudent
  1. (SnoCHAR(9)PRIMARYKEY,
  2. SnameCHAR(20)NOTNULL,
  3. SsexCHAR(4),108); list-style-type:decimal-leading-zero; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; list-style-position:outside!important"> SageSMALLINT,248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; list-style-position:outside!important"> SdeptCHAR(20))tablespacestarivespace;
  4. TABLESC
  5. CHAR(9) CnoCHAR(6) GradeKEY(Sno,Cno),153); background-color:inherit; font-weight:bold">constraintf1FOREIGNKEY(Sno)REFERENCESStudent(Sno),153); background-color:inherit; font-weight:bold">KEY(Cno)REFERENCESCourse(Cno)
  6. )tablespacestarivespace

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

  1. [sql] view plain copy
    1. replace
    2. packagesdept_or_gradeas
    3. procedureprint_sdept(psnochar);
    4. procedureprint_grade(psnochar);
    5. end;
    6. /



  2. 程序包已创建。

创建包体

copy

    replace
  1. packagebodysdept_or_grade
  2. as
  3. char)as
  4. psdeptstudent.sdept%type;
  5. begin
  6. selectsdeptintopsdept
  7. fromstudent
  8. wheresno=psno;
  9. dbms_output.put_line(psdept);
  10. exception
  11. whenno_data_foundthen
  12. dbms_output.put_line('Invalidstudentnumber');
  13. end;
  14. pgradeSC.grade%type;
  15. cursorprintgradeisselectgradeintopgrade
  16. fromsc
  17. begin
  18. openprintgrade;
  19. loop
  20. fetchprintgradeintopgrade;
  21. dbms_output.put_line(pgrade);
  22. exitwhenprintgrade%notfound;
  23. endloop;
  24. closeprintgrade;
  25. end;
  26. /

程序包体已创建。
获取结果

copy
    SQL>setserveroutputon;
  1. SQL>
  2. SQL>executesdept_or_grade.print_sdept('0201');
  3. cs
  4. PL/SQL过程已成功完成。
  5. executesdept_or_grade.print_grade('0201');
  6. 89
  7. 64
  8. 50
  9. 50
  10. PL/SQL过程已成功完成。

四 心得体会


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


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

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

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

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

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

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

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


转载地址:http://blog.itpub.net/26435490/viewspace-1078212/

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读