2017-01-06 9 views
4

以下のコードを実行中に次のエラーメッセージが表示されます。私は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' の、あまりにも多くの宣言は、このコールに一致する

+3

試し: 'DBMS_OUTPUT.PUT_LINE( 'エリア(R = 3):' || learn.Area(i_rad => x)); ' – krokodilko

+1

2番目のArea関数に2番目のパラメータのデフォルト値があるので、1つのパラメータでAreaを呼び出すかどうかをpl/sqlがどのように認識しますか? – OldProgrammer

答えて

3

を。 paramのみを指定した場合、2番目の関数は2番目の値を3と仮定し、呼び出し可能な2つの関数が存在するため、呼び出しは失敗します。

どのような機能が何をしているのかわからないので、この種のオーバーロードをしないことをお勧めします。

これをやりたければ、2番目のパラメータを必須にし、渡すべき値がなければ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; 
/

別のparamの名前を持っている場合は、あなたがこれを行うことができます:

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; 
/
2

ので、 i_widthにはデフォルト値があり、1つのnumber引数で呼び出すことができる2つの関数があります。これらの両方の機能が異なる領域を計算するので、区別するための良い方法は、単純に別の名前を使用することです:あなたは2つのparam機能で2番目のパラメータのデフォルト値を持っているためだ

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; 
/
関連する問題