1、Package概念

按照业务逻辑、把相关的Func,Procedure 组织到一起,形成一个函数或者过程集合,这就是 一个Package,这是PLSQL中程序的一种组织形式。

2、Package组成

Package由包说明(package Specification)和包体(package body)两部分构成; 包说明 部分相当于C语言里面的.H文件,包体部分相当于 C语言里面针对.H实现的C文件。
image.png

3、Package常用SQL

image.png

4、Package好处

1、模块化:一般把有相关性的函数和过程放到一个Package中;
2、易设计:可以把包说明和包体分别编写和编译,先编写和编译包说明部分,在编写和说明包体部分;这有利 于分工合作;
3、信息隐藏:包体中函数可以部分出现在包说明中,只有出现在包说明中的函数和过程才是该Package的公有 函数和过程,可以被其他包中的函数调用,否则对其他包中的函数是不可见的,未在包说明部分出现的函数 和过程相当于私有的。
4、加载性能提高:当Package中有一个函数或过程被调用时,整个Packege就被加载到内存中,这样当该 Package中其他函数被调用时,就直接从内存读取了,可以减少磁盘IO,从而提高性能。 这个特性也提醒 不要去搞巨无霸的Package, 把用到的任何 函数都写到一个Package中,这会导致严重的内存浪费。
5、重载:一个package 中可以定义同名、不同参数的函数或过程。

5、Package中的向前声明特性

在Package body中,一个函数中调用另一个函数(也在该Package中),则另 一个函数必须在前面先定义;如果非要调用在程序代码中后定义的函数,可把这个函数设置成公有函数,在 包说明部分说明;

  1. CREATE OR REPLACE PACKAGE BODY forward_pack
  2. IS
  3. PROCEDURE award_bonus(. . .)
  4. IS
  5. BEGIN
  6. calc_rating(. . .); --非法引用
  7. END;
  8. PROCEDURE calc_rating(. . .)
  9. IS
  10. BEGIN
  11. ...
  12. END;
  13. END forward_pack;
  14. /

6、Package中的初始化过程代码

  1. CREATE OR REPLACE PACKAGE taxes
  2. IS
  3. tax NUMBER;
  4. ... -- declare all public procedures/functions
  5. END taxes;
  6. /
  1. CREATE OR REPLACE PACKAGE BODY taxes
  2. IS
  3. ... -- declare all private variables
  4. ... -- define public/private procedures/functions
  5. BEGIN
  6. SELECT rate_value
  7. INTO tax
  8. FROM tax_rates
  9. WHERE rate_name = 'TAX';
  10. END taxes;
  11. /

Package中可以写一段初始化过程代码,这段代码只是一个Session中加载时被执行一次,一般用于一些复杂 变量的初始化(比如某个公有变量的初始化值是需要通过一段负责的SQL来获取的);如果没有这样的初始 化代码需求,那么一般可以在这部分写个NULL;就可以了。

7、Package中的变量的持久状态

  1. CREATE OR REPLACE PACKAGE comm_package IS
  2. g_comm NUMBER := 10; --初始化为 10
  3. PROCEDURE reset_comm (p_comm IN NUMBER);
  4. END comm_package;
  5. /
  1. CREATE OR REPLACE PACKAGE BODY comm_package IS
  2. FUNCTION validate_comm (p_comm IN NUMBER) RETURN BOOLEAN
  3. IS v_max_comm NUMBER;
  4. BEGIN
  5. ... -- 校验 commission是否低于数据库表中的最大ommission,是则返回TRUE
  6. END validate_comm;
  7. PROCEDURE reset_comm (p_comm IN NUMBER)
  8. IS BEGIN
  9. ... -- 调用 validate_comm 判断是否超出最大值,若是则
  10. -- RAISE_APPLICATION_ERROR; 否则设置g_comm := p_comm
  11. END reset_comm;
  12. END comm_package;
  13. /

image.png