我有一个包含两种方法的包:
create or replace package demo
as
function overloaded(p_in varchar2)
return pls_integer;
function overloaded(p_in raw)
return pls_integer;
end;
/
create or replace package body demo
as
function overloaded(p_in raw)
return pls_integer
is
begin
return 1;
end;
function overloaded(p_in varchar2)
return pls_integer
is
begin
return 2;
end;
end;
/
它编译没有任何错误,但我无法调用任何一种方法,因为在这两种情况下我都会收到错误PLS-00307: too many declarations match this call
。为什么RAW
和VARCHAR2
会发生这种情况?我该如何解决这个限制?给我的子程序提供不同的名称是唯一的出路吗?
答案 0 :(得分:3)
PL / SQL允许您重载嵌套的子程序,包子程序和类型方法。如果它们的形式参数在名称,编号,顺序或数据类型族上不同,则可以对几个不同的子程序使用相同的名称。
根据the appendix that refers to,varchar2
和raw
都是char
数据类型系列的成员。
您可以为子程序指定不同的名称,但您也可以更改形式参数的名称和顺序;在这种情况下,因为只有一个参数意味着您只能更改名称:
create or replace package demo
as
function overloaded(p_in_vc varchar2)
return pls_integer;
function overloaded(p_in_raw raw)
return pls_integer;
end;
/
(当然身体也有同样的变化);然后使用named notation调用实际参数:
select demo.overloaded(p_in_vc=>'test') from dual;
DEMO.OVERLOADED(P_IN_VC=>'TEST')
--------------------------------
2
select demo.overloaded(p_in_raw=>'AABB') from dual;
DEMO.OVERLOADED(P_IN_RAW=>'AABB')
---------------------------------
1