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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PLS-00307子程序仅在类型参数方面有所不同(RAW与VARCHAR2)相关的知识,希望对你有一定的参考价值。

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

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

答案

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

以上是关于PLS-00307子程序仅在类型参数方面有所不同(RAW与VARCHAR2)的主要内容,如果未能解决你的问题,请参考以下文章

非递归 DFS 与 BFS,仅在堆栈与队列方面有所不同?

VC调用易语言DLL

错误:防止写入仅在大小写或查询字符串方面与已写入文件不同的文件。反应js laravel

js中的callapplybind

使用仅在执行时已知的类型参数调用泛型方法[重复]

模板函数替换仅在一个参数中未使用std :: function时才起作用