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
。为什么RAW
和VARCHAR2
会发生这种情况?我该如何解决这个限制?唯一的出路是给我的子程序赋予不同的名字吗?
答案
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
以上是关于PLS-00307子程序仅在类型参数方面有所不同(RAW与VARCHAR2)的主要内容,如果未能解决你的问题,请参考以下文章