包的重载

在包的内部,过程和函数可以被重载(Overload)。也就是说,可以有一个以上的名称相同但是参数不同的过程或函数,这样就允许用不同的参数调用同一个名字的过程或函数。由于重载允许将相同的操作施加在不同类型的对象上,因此它是过程语言的一个重要特点。

说明:

在很多情况下可以通过参数类型不同来实现重载,但仍要受到一些限制,应尽量避免在下列情况:

两个子程序的参数仅在名称或输入输出类型(IN、OUT、IN OUT)上不同。例如:

PROCEDURE overload_procedure(p_theparameter IN INT);
PROCEDURE overload_procedure(p_theparameter OUT INT);

其中,IN、OUT为参数类型,NUMBER为数据类型。上述两个过程在类型上不同,所以不能重载。

两个函数仅在返回类型上不同。例如:

FUNCTION overload_function RETURN VARCHAR;
FUNCTION overload_function RETURN INT;

两个子程序仅是参数类型不同但是它们类型的类族(Type Family)相同。重载子程序的参数必须是数据类型不同或其类型间不可自动转换。例如,由于CHAR和VARCHAR属性同一类族,所以不能重载下面的存储过程:

PROCEDURE overload_char(p_theparameter IN CHAR);
PROCEDURE overload_char(p_theparameter IN VARCHAR);

注解

包含上述情况的包虽然编译可以通过,但在调用时有可能产生不可知的错误,应尽量避免创建这种包。

示例:包的重载

--  清理环境
DROP PACKAGE pack;
DROP TABLE tab CASCADE;

CREATE TABLE tab
(
    a int,
    b int,
    c float
);
INSERT INTO tab VALUES(1,1,0.5);


--包重载
CREATE OR REPLACE PACKAGE pack AS
    FUNCTION add(a INT, b INT) RETURN INT;
    FUNCTION add(a INT, b INT,c FLOAT) RETURN FLOAT;
    PROCEDURE add(a VARCHAR(30),b VARCHAR (30));
END pack;
/

CREATE OR REPLACE PACKAGE BODY pack AS
    
    FUNCTION add(a INT, b INT) RETURN INT AS
    BEGIN
        RETURN a+b;
    END add;
    
    FUNCTION add(a INT, b INT, c FLOAT) RETURN FLOAT AS
    BEGIN
        RETURN a+b+c;
    END add;
    
    PROCEDURE add(a varchar(30), b varchar(30)) AS
    DECLARE 
    BEGIN
        dbms_output.put_line( a || b);
    END add;    
END pack;

/
SELECT pack.add(a,b) FROM tab;
ADD(int)      |
--------------
2             |
总数目:1


SELECT pack.add(a,b,c) FROM tab;
ADD(float)      |
----------------
2.5             |
总数目:1


EXEC pack.add('aa','bb');

--删除包
DROP PACKAGE pack;