我在运行以下代码时收到以下错误消息.我是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”的声明太多与此调用匹配
解决方法
那是因为你的两个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; /