程序包是ORACLE PL/SQL的一个特性,它就像是一个容器或者说是一个命名空间,可以将各种逻辑相关的类型、常量、变量、异常和子程序结合在一起。为开发人员编写大型复杂应用程序时,提供了一个良好的组织单元。
当定义好了程序包之后,应用程序就可以通过包来访问各种不同的功能单元,而不用担心过多零散的子程序导致程序代码的松散。
一个PL/SQL程序包包含如下两个部分组成:
·包规范:主要是包的一些定义信息,不包含具体的代码实现部分。
·包体:包体是对包规范中声明的子程序的实现部分,包体的内容对于外部应用程序来说是不可见的,包体就像是一个黑匣子一样,是对包规范的实现。
1、包规范基本语法
CREATE [OR REPLACE] PACKAGE PACKAGE_NAME
{IS | AS}
PACKAGE_SPECIFICATION
END PACKAGE_NAME;
例子:
--/
CREATE OR REPLACE PACKAGE pack_fun IS
--定义一个函数返回两个数的和
FUNCTION fun_add(num1 IN NUMBER, num2 IN OUT NUMBER) RETURN NUMBER;
--定义一个函数返回两个数的差
FUNCTION fun_sub(num1 IN NUMBER, num2 IN OUT NUMBER) RETURN NUMBER;
--定义一个存储过程显示九九乘法表
PROCEDURE proc_1;
END;
/
2、包体基本语法
CREATE [OR REPLACE] PACKAGE BODY PACKAGE_NAME
{IS | AS}
PACKAGE_BODY
END PACKAGE_NAME;
如果包体中的函数有一个修改了,就得全部重新编译。
--/
CREATE OR REPLACE PACKAGE BODY pack_fun IS
FUNCTION fun_add(num1 IN NUMBER, num2 IN NUMBER) RETURN NUMBER IS
tmp NUMBER;
BEGIN
tmp := num1 + num2;
RETURN tmp;
END fun_add;
FUNCTION fun_sub(num1 IN NUMBER, num2 IN NUMBER) RETURN NUMBER IS
tmp NUMBER;
BEGIN
tmp := num1 - num2;
RETURN tmp;
END fun_sub;
PROCEDURE proc_1 IS
M NUMBER := 0;
BEGIN
FOR I IN 1 .. 9 LOOP
FOR J IN 1 .. I LOOP
M := I * J;
DBMS_OUTPUT.PUT(I || '*' || J || '=' || M || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(NULL);
END LOOP;
END proc_1;
END pack_fun;
/
3、调用包中的函数和存储过程
select pack_fun.fun_add(9,8) from dual;
select pack_fun.fun_sub(9,8) from dual;
--/
BEGIN
pack_fun.proc_1;
END;
/