oracle数据库对象-包

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