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

问题描述 投票:1回答:1

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

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会发生这种情况?我该如何解决这个限制?唯一的出路是给我的子程序赋予不同的名字吗?

oracle plsql overloading
1个回答
3
投票

documentation says

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

根据the appendix that refers to,'varchar2raw都是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
© www.soinside.com 2019 - 2024. All rights reserved.