sql—要使用检查表的函数重载包,请给定deptno和deptname

vd8tlhqk  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(329)

Package 规格:

create or replace package p_overload_demo is
function dept_match(v_deptno number) return boolean;
function dept_match(v_dname varchar2) return boolean;
end  p_overload_demo;

包体:

create or replace package body p_overload_demo is
function dept_match(v_deptno number) return boolean is
cdeptno number;
begin
select count(*) into cdeptno from dept where deptno=v_deptno;
if (cdeptno>0)
then 
return true;
DBMS_OUTPUT.put_line('TRUE');
else 
return false;
DBMS_OUTPUT.put_line('FALSE');
end if;
end dept_match;
function dept_match(v_dname varchar2) return boolean is
c_dname number;
begin
select count(*) into c_dname from dept where dname=v_dname;
if (c_dname>0)
then 
return true;
else 
return false;
end if;
end dept_match;
end p_overload_demo;

测试呼叫:

declare
exists boolean;
begin
exists:=p_overload_demo.dept_match(22);
if(exists='True') then
dbms_output.put_line('TRUE');
else
dbms_output.put_line('FALSE');
end if;
end;

测试函数时出现以下错误:
ora-06550:第1行,第56列:pls-00221:“部门匹配”不是程序或未定义
ora-06550:第1行,第56列:
有人能告诉我为什么会这样,我如何测试我的重载函数吗?

zbdgwd5y

zbdgwd5y1#

到这个时候,你已经得到了你的答案,但我仍然想张贴我的想法。
如果遵循规则,过载应该是开箱即用的。另外,不要使用为oracle保留的关键字作为变量名。存在。在这种情况下,使用它有时会出现错误(不确定是否注意到)。
不过,我修改了函数,减少了几行代码,并用匿名块模拟了相同的代码(应该也可以与包一起使用),它可以按预期工作。

declare
  function dept_match(v_deptno number)
  return boolean 
  is
    cdeptno number;
  begin
    select count(*) into cdeptno 
      from (select 10 deptno from dual) 
    where deptno=v_deptno;
    return (cdeptno>0);
  end dept_match;

  function dept_match(v_dname varchar2)
  return boolean is
    c_dname varchar2(100);
  begin
    select count(*) into c_dname 
      from (select 'A' dname from dual) 
    where dname=v_dname;
    return (c_dname>0);
  end dept_match;
begin
  -- with varchar
  if dept_match('A') then
     dbms_output.put_line('TRUE');
  else
     dbms_output.put_line('FALSE');
  end if;
  --with number
  if dept_match(10) then
     dbms_output.put_line('TRUE');
  else
     dbms_output.put_line('FALSE');
  end if;
  --negative test case
  if dept_match('B') then
     dbms_output.put_line('TRUE');
  else
     dbms_output.put_line('FALSE');
  end if;
end;
/
ubof19bj

ubof19bj2#

pls-00221表示您没有运行显示的匿名块:

declare
exists boolean;
begin
exists:=p_overload_demo.dept_match(22);
if(exists='True') then
dbms_output.put_line('TRUE');
else
dbms_output.put_line('FALSE');
end if;
end;

(它有自己的几个问题),但更接近你的观点 execute 评论:

begin
  p_overload_demo.dept_match(22);
end;

在这种情况下,您将调用一个名为 dept_match ,并且正如错误所说,没有具有该名称的过程。您有两个同名函数,因此可以调用它们,但需要将返回值赋给某个对象—正如您原来的匿名块所声称的那样,这样就不能像您实际运行时那样得到该错误。
其他问题都解决了:

declare
  l_exists boolean;
begin
  l_exists:=p_overload_demo.dept_match(22);
  if (l_exists) then
    dbms_output.put_line('TRUE');
  else
    dbms_output.put_line('FALSE');
  end if;
end;
/

将抛出“pls-00307:too many dept\u match”声明与此调用匹配,因为您已经用一个数字参数声明了这两个函数。你可以这样做,你只需要在给他们打电话的时候更明确一点;但是由于第二个函数试图匹配一个名称,所以声明是错误的,第二个函数应该用 v_dname in varchar2 ,无论是说明书还是正文(我现在看到你在编辑你的问题时纠正了这一点,但我还是把它留在这里。)
修正后,上面的方块就可以工作了。
db<>摆弄固定的函数参数数据类型,并同时调用两个函数;注意你实际上并不需要 l_exists 所以我把它从第二个变量中去掉了。

mwyxok5s

mwyxok5s3#

我可能要迟到了,但是…你的包裹没有什么不对劲的。除了函数中的dbms\u output语句永远不能执行,因为它们前面的return语句退出函数。但是,它们可以缩短。因为返回类型是布尔型的,所以不需要if语句,只要返回比较(的结果),因为它会生成所需的布尔型。请看这里的演示。因为db<>fiddle不支持dbms\u输出(至少我不能得到ti)。我为消息创建了一个日志表(有趣的是,我看了@alex post和dbms\u的输出,想知道我遗漏了什么?)

相关问题