包概述
包是一个模式对象,它对逻辑上的 类型、变量、常量、子程序、游标和异常进行分组。包被编译并存储在数据库中,应用程序可以在数据库中可以共享其内容。
包由包规范(Specification) 和包体(Body) 两部分组成, 在数据库中独立存储。 其中,规范声明了可以从包外部引用的公共项。如果公共项包含游标或子程序,则包也必须具有主体。主体必须定义公共游标的查询和公共子程序的代码。主体还可以声明和定义私有项,这些私有项不能从包外部引用,但是对于包的内部工作是必需的。最后,主体可以有一个初始化部分(其语句初始化变量并执行其他一次性设置步骤)和一个异常处理部分。
利用包可以实现代码复用, 提高程序的可靠性、 可维护性以及应用程序的开发效率。
包规范
包规范声明了包中的公共元素的作用域为包所在的模式。 在包规范中声明的元素不仅可以在包的内部使用, 也可以被应用程序调用。 如果要在包的作用域内引用一个不可见的公用元素, 需要使用包名限制包中的公共元素, 即
“
包名
.
公共元
素名
”
。
在包规范中可以定义的公共元素包括:
- Functions
- Procedures
- Cursors
- Types
- Variables
- Constants
- Record types
创建包规范语法如下:
包体
如果包规范中声明了游标( 游标没有定义) 或子程序, 那么必须创建对应的包体, 否则包体是可选的。 包体与包规范必
须同名且存放在同一个模式中。创建包体语法如下:
调用包
通过
package_name.element
形式调用, 在包体中可以直接通过元素名调用。 但是, 在包体中定义而没有在包规范中声明的元素则是私有的, 只能在包体内部引用。
实例
-- 创建表数据 create table test(x int, y varchar(100)); insert into test values(1, 'One'); insert into test values(2, 'Two'); -- 创建包规范 create or replace package pkgrec as type rectype is record(a test.x%type, b test.y%type); rcvar rectype; function initvars return int; function getvars return int; end; / -- 创建包体 create or replace package body pkgrec as function initvars return int as begin select x, y into rcvar from test where x = 2; return rcvar.a; end; function getvars return int as begin raise info 'rcvar.a = %, rcvar.b = %', rcvar.a, rcvar.b; return 0; end; end; / -- 调用包 select pkgrec.initvars(); initvars ---------- 2 (1 row) select pkgrec.getvars(); INFO: rcvar_pr.a = 12, rcvar_pr.b = Two Ten getvars --------- 0 (1 row)