包的重载¶
在包的内部,过程和函数可以被重载(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;