程序包是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;
/