代码之家  ›  专栏  ›  技术社区  ›  Alexey

PLS-00307当子程序仅在类型参数上不同时(RAW vs VARCHAR2)

  •  1
  • Alexey  · 技术社区  · 7 年前

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

    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 ?我如何绕过这个限制?给子程序起不同的名字是唯一的出路吗?

    1 回复  |  直到 7 年前
        1
  •  3
  •   Alex Poole    7 年前

    这个 documentation says :

    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