PLS-00307子程序仅在类型参数方面有所不同(RAW与VARCHAR2)

时间:2018-03-05 15:09:55

标签: oracle plsql overloading

我有一个包含两种方法的包:

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。为什么RAWVARCHAR2会发生这种情况?我该如何解决这个限制?给我的子程序提供不同的名称是唯一的出路吗?

1 个答案:

答案 0 :(得分:3)

documentation says

  

PL / SQL允许您重载嵌套的子程序,包子程序和类型方法。如果它们的形式参数在名称,编号,顺序或数据类型族上不同,则可以对几个不同的子程序使用相同的名称。

根据the appendix that refers tovarchar2raw都是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