什么是包
包是一种数据库对象,相当于一个容器。将逻辑上相关的过程、函数、变量等元素组合成一个更大的单元。
包的组成
包由包头和包体两部分组成。包头中声明的元素是公有对象,对外部可见;包体中声明的元素为该包的私有对象,仅该包可见;包体中自定义所有公有对象和私有对象。
包头中可以声明公有变量、常量、类型、自定义异常、游标和子程序。
包体中可以声明私有变量、常量、类型、自定义异常、游标和子程序。也可以定义上述所有对象,另外,包体中可以定义自己的初始化块,初始化块仅在创建时执行,可以在创建时将包中定义的变量等初始化。
包的优点
1.简化应用设计
包将一个模块的PLSQL程序元素组织到一起,每个包相互独立,便于管理。
2.提高应用性能
包在首次调用时,就整体存入内存,之后的访问都不需要再进行I/O操作。
3.实现信息隐藏
包中分为公有和私有部分,只对外提供公有的接口,私有的内容对外不可见。
4.解决命名冲突
在不同的包中,过程、函数、变量等元素都可以重名,解决了命名冲突问题。
包的使用规则
- 包头可以单独存在,但是包体的定义一定要在包头定义之后。
- 包体中必须定义所有包头中声明的对象。
- 允许创建不包含任何函数或存储过程的包头和包体。
- 包体中的私有元素不能被外部直接使用,但可以通过公有子程序间接使用。
- 如果更新包头,则必须重新编译包体后才能正常使用;如果仅更改包体,则无需重新编译包头。
包的使用规则场景
1. 单独定义一个包头,正确执行;单独定义一个包体,报错。
--定义包头,创建成功
test=# CREATE OR REPLACE PACKAGE pkg1 AS
test-# i int;
test-# PROCEDURE pt1();
test-# END;
test-# /
CREATE PACKAGE
--定义包体,报错
test=# CREATE OR REPLACE PACKAGE BODY pkg2 AS
test-# PROCEDURE pt1() AS
test-# BEGIN
test-# NULL;
test-# END;
test-# END;
test-# /
ERROR: package "pkg2" does not exist
2. 包体中未定义包头中所有声明的对象
--创建一个包头,声明两个存储过程pt1,pt2
test=# CREATE OR REPLACE PACKAGE pkg3 AS
test-# PROCEDURE pt1();
test-# PROCEDURE pt2();
test-# END;
test-# /
CREATE PACKAGE
--创建对应的包体,只定义其中一个存储过程pt1。报错提示pt2也必须在包体中定义
test=# CREATE OR REPLACE PACKAGE BODY pkg3 AS
test-# &n