太多的宣言了

时间:2017-01-06 18:49:54

标签: oracle plsql

运行以下代码时出现以下错误消息。我是编码pl / sql(oracle)世界的新手,我也请求你的帮助。

代码:

create or replace package learn is 
function Area(i_rad NUMBER) return NUMBER;
function Area(i_length NUMBER, i_width NUMBER:=3) 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:=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'过多的声明匹配此次电话

2 个答案:

答案 0 :(得分:3)

那是因为你的两个参数函数中的第二个参数有默认值。如果你只提供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;
 /

答案 1 :(得分:2)

由于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;
/