Oracle 太多的声明

Oracle 太多的声明,oracle,plsql,Oracle,Plsql,运行以下代码时,我收到以下错误消息。我是pl/sql(oracle)编码领域的新手,我请求您的帮助 代码: 包体: create or replace package body learn is function Area(i_rad NUMBER) return NUMBER is v_pi NUMBER:=3.14; v number:=to_number(i_rad); begin return v_pi * (i_rad ** 2); end; function Area(i_leng

运行以下代码时,我收到以下错误消息。我是pl/sql(oracle)编码领域的新手,我请求您的帮助

代码:

包体:

create or replace package body learn is 
function Area(i_rad NUMBER) return NUMBER
is
v_pi NUMBER:=3.14;
v number:=to_number(i_rad);
begin
return v_pi * (i_rad ** 2);
end;
function Area(i_length NUMBER, i_width NUMBER:=3) return NUMBER
is
begin
return i_length * i_width;
end;
end learn;
Plsql块

declare
 x number(2):=2;
 y number(2):=5; 
 begin
 DBMS_OUTPUT.put_line('Area (R=3):'||learn.Area(x));
 DBMS_OUTPUT.put_line('Area (R=3):'||learn.Area(x,y));
 end;

错误消息:“AREA”的声明太多与此调用匹配

因为
i_width
有一个默认值,所以您有两个函数可以用一个
number
参数调用。由于这两个函数计算的面积不同,因此区分的一个好方法是使用不同的名称:

CREATE OR REPLACE PACKAGE learn IS
    FUNCTION circle_area(i_rad NUMBER) RETURN NUMBER;
    FUNCTION rectangle_area(i_length NUMBER, i_width NUMBER:=3) RETURN NUMBER;
    -- And the same changes in the package body, of course.
END;
/

这是因为双参数函数中的第二个参数有默认值。如果只提供param,则第二个函数将假定第二个值为3,现在可以调用两个函数,因此调用失败

我建议您不要做这种重载,因为不清楚哪个函数做什么

如果您仍然想这样做,一种方法是将第二个参数设为强制参数,如果您没有任何要传递的值,则传递null

create or replace package learn is
function Area(i_rad NUMBER) return NUMBER;
function Area(i_length NUMBER, i_width NUMBER) return NUMBER;
end;
/

create or replace package body learn is 
function Area(i_rad NUMBER) return NUMBER
is
v_pi NUMBER:=3.14;
v number:=to_number(i_rad);
begin
return v_pi * (i_rad ** 2);
end;
function Area(i_length NUMBER, i_width NUMBER) return NUMBER
is
begin
return i_length * nvl(i_width,3);
end;
end learn;
/

declare
 x number(2):=2;
 y number(2):=5; 
 begin
 DBMS_OUTPUT.put_line('Area (R=3):'||learn.Area(x));
 DBMS_OUTPUT.put_line('Area (R=3):'||learn.Area(x,y));
 end;
 /
如果您有不同的参数名称,可以执行以下操作:

declare
 x number(2):=2;
 y number(2):=5; 
 begin
 DBMS_OUTPUT.put_line('Area (R=3):'||learn.Area(i_rad => x));
 DBMS_OUTPUT.put_line('Area (R=3):'||learn.Area(x,y));
 end;
 /

try:
DBMS_OUTPUT.put_line('Area(R=3):'| learn.Area(i_rad=>x))
您的第二个Area函数的第二个参数有一个默认值,那么pl/sql如何知道您是想用一个参数调用Area,还是第二个实例?
declare
 x number(2):=2;
 y number(2):=5; 
 begin
 DBMS_OUTPUT.put_line('Area (R=3):'||learn.Area(i_rad => x));
 DBMS_OUTPUT.put_line('Area (R=3):'||learn.Area(x,y));
 end;
 /