上次针对包进行了简单的说明,这次进行深入介绍。
正如上回解说的那样,包是将过程、函数、变量等打包一块的内容,分为申明和定义两个部分。
(实际上只有申明没有定义的包存在,其他时间介绍。)
申明部是“总结了用户和应用程序可以使用的东西或者接口”。
与此相对,定义中记述的内容不能由用户或应用程序直接使用的内容。实现了接口与实现分离的作用。
申明部中记述的过程和函数的接口,对于用户或者调用者来看所需的接口的信息。
因此,申明部不会写把程序和功能实现逻辑完全写出来。
申明部记述的过程和函数的接口的信息,也就是说,程序和函数的名称、临时参数的名称、模式、数据类型、
还有函数的情况下返回的数据类型。
他是过程和函数定义的「IS」之前的部分。
这个部分叫过程和函数的「式样」。
基本语法如下:
申明部用 CREATE[OR REPLACE] PACKAGE 来实现,
实现用 CREATE[OR REPLACE] PACKAGE BODY 来实现。
<包申明部语法>
CREATE OR REPLACE PACKAGE 包名
IS
变量声明;
程序和函数的声明;—比定义的“IS”更早的部分
END;
<包实现的语法>
CREATE OR REPLACE PACKAGE BODY包装名称
IS
声明变量;
完整的过程和函数的定义逻辑;
END;
以下是具体例子:
在本示例中,定义了包PAC1,面向客户定义了一个PROCA,传递了一个参数。
PROCA调用PROCB,PROCB中 吧 PROCA传递的参数+1。
PROCA里边吧计算的值显示到画面上。
为了更容易理解包装的本质,在其他程序PROCB中进行值加1的处理,将其结果暂时保存在变量V1中。
<包的申明>
SQL> CREATE OR REPLACE PACKAGE PAC1
2 IS
3 —PROCA程序的声明
4 PROCEDURE PROCA ( PA IN NUMBER);
5 END;
6 /
包已创建。
<包的实现>
SQL> CREATE OR REPLACE PACKAGE BODY PAC1
2 IS
3 --变量V1的声明
4 V1 NUMBER;
5 --PROCB过程的完整定义
6 PROCEDURE PROCB ( PB IN NUMBER)
7 IS
8 BEGIN
9 V1 := PB + 1;
10 END PROCB;
11 —PROCA过程的完整定义
12 PROCEDURE PROCA ( PA IN NUMBER)
13 IS
14 BEGIN
15 PROCB(PA);–调用PROCB过程
16 DBMS_OUTPUT.PUT_LINE(V1);
17 END PROCA;
18 END;
19 /
包主体完成。
<包执行过程示例>
SQL>SET SERVEROUT ON --使画面输出有效
SQL>EXEC PAC1.PROCA(99)- -在参数99中调用PAC1封装的PROCA
100
PL/SQL过程成功完成。
这里,包申明部的PROCA与包实现的PROCA的定义。
另外,注意包的实现里边,PROCB程序在申明部没有被申明。
也就是说,PROCB过程不能由用户或者其他程序直接调用。
用户能够调用的是PROCA,PROCB是由PROCA调用。
同样,定义部里边定义的变量V1(定义第4行)也不能由用户直接参照使用。
变量V1仅限于定义实体中的PROCB和PROCA所使用的。
像这样,处理时需要的变量和过程,用户不需要直接使用,这时候只需要在包实现里边记述即可,
不需要记述在包的定义部部。
无论是申明部还是实现部,变量声明前如果有程序或函数,则会发生编译错误。
譬如在上述实现示例中,在变量V1定义之前,如果有PROCA和PROCB的定义,则会发生编译错误。
另外,申明部没有申明的程序和功能,需要在实现部里边优先优先,否则会出错。
因此,在上述实现的例子中,PROCB的定义如果写在PROCA的定义之后,就会发生编译错误
这是关于包的申明和定义详细解释。