1.包的概念
(1)包的相关概念
包(Package)是将一组相关联的PL/SQL类型(如RECORD类型)、变量、常量、异常、游标和子程序(过程和函数)等封装在一起的数据结构。包通常包括两个部分:规范和主体。
包的规范(Package Specification)又称包头,是包和应用程序的接口部分,通常含有PL/SQL类型、变量、常量、异常、游标和子程序等的声明,这些声明对应用程序是可见的,应用程序可以调用它们。
包的主体(Package Body)完整地定义了在包的规范中声明的游标、子程序,从而实现包的规范。主体内容对应用程序是不可见的。
(2)使用包的好处
- 模块化:包将逻辑上相关联的PL/SQL类型、变量、常量、异常、游标和子程序等封装进一个命名块中,接口简单,提高了应用程序的模块独立性。
- 信息隐藏:包的主体和规范中的声明都可以包括PL/SQL类型、变量、常量、异常、游标和子程序等。规范中的声明是全局的,它们在包的任何部分都是可见的,可以被外部应用程序调用;但主体中的声明只是对于主体部分可见,是包的私有声明,外部应用程序是看不见的。
- 可重用性:包可被多次重用。
- 较高的执行性能:当首次调用包的子程序时,整个包就被调入内存,以后调用时可以直接从内存中读取;由于包的规范不依赖于任何对象,若只是改变了主体部分而没有影响规范的话,则不必对规范进行重新编译。
2.包的创建
创建包使用CREATE PACKAGE语句。包的创建也分为两个部分:规范的创建和主体的创建。
(1)规范的创建
语法如下。
CREATE [OR REPLACE] PACKAGE 规范名 IS|AS
[PRAGMA SERILLY_REUSABLE;]
PUBLIC TYPE AND ITEM DECLARATION;
SUBPROGRAM SPECIFICATIONS;
[PRAGMA restrict_references(子程序名,WNDS[,WNPS][,RNDS][,RNPS])]
END 规范名;
(2)主体的创建
语法如下。
CREATE [OR REPLACE] PACEKAGE BODY 主体名 IS|AS
[PRAGMA SERIALLY_REUSABLE]
PRIVATE TYPE AND ITEM DECLARATION;
SUBPROGRAM BODIES;
END 主体名;
上面语法中的主要参数说明如下。
- PRAGMA SERIALLY_REUSABLE:该编译指令指定将包的运行状态保存在系统全局区,而不是用户全局区。这样每次调用包后,包的运行状态将被释放,可以对其连续调用。该命令可以在规范和主体中选择使用,若规范中已选用,则主体中也必须选用。
- PRAGMA restrict_references:指定了该包的纯度级别,它有4个选项。
(a)WNDS:限制该子程序不能修改数据库数据(禁止执行DML)。
(b)WNPS:限制该子程序不能修改包变量(不能给包变量赋值)。
(c)RNDS:限制该子程序不能读取数据库数据(禁止执行SELECT操作)。
(d)RNPS:限制该子程序不能读取包变量(不能将包变量赋值给其他变量)。
3.包的调用
语法如下。
包名.组织名;
包一旦在session中调用过,就会将其中的变量初始化,知道session结束时变量都是存在的,即持续化的,可以用来交换数据。
4.包的删除
语法如下。
DROP PACKAGE 包名;
包的创建、查看、编辑与删除操作也可以使用企业管理器。方法是:启动Oracle企业管理器,以system身份连接数据库,选中“方案”——》“SYSTEM”——》“源类型”——》“包”结点即可进行相应操作。