一、包的概述
1、包的概念:PL/SQL中将相关对象存储到一起的一种结构形式。相关 对象:变量、游标、异常、存储过程、函数。
2、包的组成:
(1)、包头(包规范):包含包相关信息的声明,不含有任何子程序代码。
(2)、包体:与包头分离,包头编译通过后才有可能编译通过,含有程序代码。
二、包头和包体
关于包头和包体,包含以下知识点:
1、包头
(1)、包含包内容的相关声明
(2)、定义内容是对外可见的
CREATE [OR REPLACE] PACKAGE package_name
AS|IS
variable declare;
cursor declare;
procedure declare;
function declare;
...
END [package_name];
2、包体
(1)、包含函数和过程的实现代码
(2)、包头成功通过编译后,才能进行编译
(3)、可以包含私有函数和过程
(4)、允许函数和过程的重载(函数和存储过程的名字是相同的,参数不同)
CREATE [OR REPLACE] PACKAGE BODY package_name
AS | IS
global variable;
procedures;
functions;
...
BEGIN
initialize statement;
END [package_name];
3、使用包
使用格式:
package_name.member_name[(arg1,...)]
三、包的使用需知
关于包的使用需知,包含以下知识点:
1、相关数据字典
(1)、USER_OBJECTS:用户拥有的全部数据库对象
(2)、USER_SOURCE:用户存储在数据库中程序和包的源代码
2、依赖关系
(1)、无效状态:函数、过程或包所依赖的对象发生了变化
(2)、有效状态:函数、过程或包所依赖的对象没有变化
(3)、包头不依赖于包体和具体数据库对象
(4)、包体依赖于包头,因此,修改了包头,包体变处于无效状态
无效依赖的具体处理方式:
情形 | 自动重新编译 |
---|---|
过程依赖于本地对象 | 是,在第一次重新执行时 |
过程依赖于本地过程 | 是,但是在第二次重新执行时;为了第一次重新执行成功,可以使用手动重新编译,或者第二次重新调用它 |
过程依赖于除过程外的远程对象 | 否 |
3、验证方法
如何实现远程过程的有效性检测:
1、时间戳:调用者记录的时间戳与被调用者的当前时间戳进行比较,若匹配,正常执行;若不匹配则比较签名,若签名没有发生变化,执行继续;否则,返回一个错误状态。
2、签名:包含子程序的名称,参数的数据类型、个数、模式以及函数的返回类型。若调用者记录的签名与被调用者签名不一致,需要重新编译远程过程;否则,执行继续。