1、Package概念
按照业务逻辑、把相关的Func,Procedure 组织到一起,形成一个函数或者过程集合,这就是 一个Package,这是PLSQL中程序的一种组织形式。
2、Package组成
Package由包说明(package Specification)和包体(package body)两部分构成; 包说明 部分相当于C语言里面的.H文件,包体部分相当于 C语言里面针对.H实现的C文件。
3、Package常用SQL
4、Package好处
1、模块化:一般把有相关性的函数和过程放到一个Package中;
2、易设计:可以把包说明和包体分别编写和编译,先编写和编译包说明部分,在编写和说明包体部分;这有利 于分工合作;
3、信息隐藏:包体中函数可以部分出现在包说明中,只有出现在包说明中的函数和过程才是该Package的公有 函数和过程,可以被其他包中的函数调用,否则对其他包中的函数是不可见的,未在包说明部分出现的函数 和过程相当于私有的。
4、加载性能提高:当Package中有一个函数或过程被调用时,整个Packege就被加载到内存中,这样当该 Package中其他函数被调用时,就直接从内存读取了,可以减少磁盘IO,从而提高性能。 这个特性也提醒 不要去搞巨无霸的Package, 把用到的任何 函数都写到一个Package中,这会导致严重的内存浪费。
5、重载:一个package 中可以定义同名、不同参数的函数或过程。
5、Package中的向前声明特性
在Package body中,一个函数中调用另一个函数(也在该Package中),则另 一个函数必须在前面先定义;如果非要调用在程序代码中后定义的函数,可把这个函数设置成公有函数,在 包说明部分说明;
CREATE OR REPLACE PACKAGE BODY forward_pack
IS
PROCEDURE award_bonus(. . .)
IS
BEGIN
calc_rating(. . .); --非法引用
END;
PROCEDURE calc_rating(. . .)
IS
BEGIN
...
END;
END forward_pack;
/
6、Package中的初始化过程代码
CREATE OR REPLACE PACKAGE taxes
IS
tax NUMBER;
... -- declare all public procedures/functions
END taxes;
/
CREATE OR REPLACE PACKAGE BODY taxes
IS
... -- declare all private variables
... -- define public/private procedures/functions
BEGIN
SELECT rate_value
INTO tax
FROM tax_rates
WHERE rate_name = 'TAX';
END taxes;
/
Package中可以写一段初始化过程代码,这段代码只是一个Session中加载时被执行一次,一般用于一些复杂 变量的初始化(比如某个公有变量的初始化值是需要通过一段负责的SQL来获取的);如果没有这样的初始 化代码需求,那么一般可以在这部分写个NULL;就可以了。
7、Package中的变量的持久状态
CREATE OR REPLACE PACKAGE comm_package IS
g_comm NUMBER := 10; --初始化为 10
PROCEDURE reset_comm (p_comm IN NUMBER);
END comm_package;
/
CREATE OR REPLACE PACKAGE BODY comm_package IS
FUNCTION validate_comm (p_comm IN NUMBER) RETURN BOOLEAN
IS v_max_comm NUMBER;
BEGIN
... -- 校验 commission是否低于数据库表中的最大ommission,是则返回TRUE
END validate_comm;
PROCEDURE reset_comm (p_comm IN NUMBER)
IS BEGIN
... -- 调用 validate_comm 判断是否超出最大值,若是则
-- RAISE_APPLICATION_ERROR; 否则设置g_comm := p_comm
END reset_comm;
END comm_package;
/