包装不仅仅具有把过程和函数打包的功能,还有其他只有通过包能实现的功能:
首先解释第一个功能:制作多个同名的过程函数。
例如,有些函数,内容相同,但是参数的类型和数量不同,就可以用包来实现。这个定义称为重载。
名字相同,参数的数量或者参数数据类型的不同,或者函数返回的数据类型不同来区分不同的函数。
系统根据这些不同的参数,在实际调用时的时候根据设计参数,自动判断具体调用了哪个函数,然后执行对应的代码。
以下是简单的例子:
<包申明部>
SQL> CREATE OR REPLACE PACKAGE PAC1
2 IS
3 /3个名称相同的程序 参数的类型和数量不同/
4 PROCEDURE PROC1 ( P1 IN NUMBER);
5 PROCEDURE PROC1 ( P1 IN VARCHAR2);
6 PROCEDURE PROC1 ( P1 IN VARCHAR2, P2 IN NUMBER);
7 END PAC1;
8 /
包已创建。
<包的实现>
SQL> CREATE OR REPLACE PACKAGE BODY PAC1
2 IS
3 / X1第一个PROC1程序*/
4 PROCEDURE PROC1 ( P1 IN NUMBER)
5 IS
6 BEGIN
7 DBMS_OUTPUT.PUT_LINE(‘Version 1’);
8 END;
9 /第二个PROC1程序/
10 PROCEDURE PROC1 ( P1 IN VARCHAR2)
11 IS
12 BEGIN
13 DBMS_OUTPUT.PUT_LINE(‘Version 2’);
14 END;
15 /3个PROC1程序*/
16 PROCEDURE PROC1 ( P1 IN VARCHAR2, P2 IN NUMBER)
17 IS
18 BEGIN
19 DBMS_OUTPUT.PUT_LINE(‘Version 3’);
20 END;
21 END PAC1;
22 /
包制作完成。
<每个包过程的执行示例>
SQL> SET SERVEROUTPUT ON
SQL>EXEC PAC1.PROC1(123)←在参数中指定数值
Version1←结果
PL/SQL过程成功完成。
SQL>EXEC PAC1.PROC1(“ABC”)←在参数中指定字符
Version2←结果
PL/SQL过程成功完成。
SQL>EXEC PAC1.PROC1('XYZ’,321)←在参数中指定文字和数值
Version3←结果
PL/SQL过程成功完成。
简单地解说一下。
首先,在包的申明部,申明了3个PROC1程序,但是各自参数的数据类型和数量不同。
然后在包的实现上定义了各自的PROC1程序。
差别是分别将“Version1”、“Version2”、“Version3”的信息显示在画面上。
在执行例中,根据参数的设置方法不同,各自显示的结果也相同。
也就是说,根据参数的设置方法,系统可以自动判断调用哪个版本。
这样,使用包的话,可以定义同名的子程序(过程、功能)。
这是实用包的第一个好处。