一包的组成
@H_502_14@二 包的语法规则
包头的语法如下:
@H_502_14@ @H_502_14@
[sql]
view plain
copy
@H_502_14@
@H_502_14@
@H_502_14@
包体创建 的语法:
- createorreplacepackage包名
- As|IS
- procedure过程名();
- Function函数名()return数据类型;
- 变量定义;
- 异常定义;
- 光标定义;
- ...........
- ...........
- End包名;
包体创建 的语法:
copy
@H_502_14@
@H_502_14@
@H_502_14@
@H_502_14@
三 包的应用与举例
下面是student 和SC表的定义:copy
@H_502_14@
@H_502_14@
@H_502_14@
实例:定义一个包,实现如果功能: 输入学号,分别返回该学生的所在系和相应的选课成绩(如果有多门成绩,那么就输出多门成绩)。
定义包头:
- CREATETABLEStudent
- (SnoCHAR(9)PRIMARYKEY,
- SnameCHAR(20)NOTNULL,
- 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;
- TABLESC
- 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)
- )tablespacestarivespace
实例:定义一个包,实现如果功能: 输入学号,分别返回该学生的所在系和相应的选课成绩(如果有多门成绩,那么就输出多门成绩)。
定义包头:
-
[sql] view plain copy@H_502_14@ @H_502_14@ @H_502_14@
- replace
- packagesdept_or_gradeas
- procedureprint_sdept(psnochar);
- procedureprint_grade(psnochar);
- end;
- /
- 程序包已创建。
创建包体:
copy
@H_502_14@ @H_502_14@ @H_502_14@- replace
- packagebodysdept_or_grade
- as
- char)as
- psdeptstudent.sdept%type;
- begin
- selectsdeptintopsdept
- fromstudent
- wheresno=psno;
- dbms_output.put_line(psdept);
- exception
- whenno_data_foundthen
- dbms_output.put_line(\'Invalidstudentnumber\');
- end;
- pgradeSC.grade%type;
- cursorprintgradeisselectgradeintopgrade
- fromsc
- begin
- openprintgrade;
- loop
- fetchprintgradeintopgrade;
- dbms_output.put_line(pgrade);
- exitwhenprintgrade%notfound;
- endloop;
- closeprintgrade;
- end;
- /
程序包体已创建。
获取结果:
copy@H_502_14@ @H_502_14@ @H_502_14@- sql>setserveroutputon;
- sql>
- sql>executesdept_or_grade.print_sdept(\'0201\');
- cs
- PL/sql过程已成功完成。
- executesdept_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接口的实现类。
猜你在找的Oracle相关文章