【问题标题】:Wrong arguments inside function (oracle)函数内部的错误参数(oracle)
【发布时间】:2019-03-11 07:54:00
【问题描述】:

我有基本功能:

create or replace function t_owner(tname in varchar2, oname out varchar2)
return varchar2
is
begin
  select owner into oname from table where table_name = 'tname';
  return oname;
end;

select t_owner('table_test') from dual;

当我调用它时,我得到了这个:

ORA-06553:PLS-306:调用“T_OWNER”时参数的数量或类型错误

【问题讨论】:

    标签: oracle function varchar


    【解决方案1】:

    函数不应该有 OUT 参数;无论如何,他们返回该值。所以:

    create or replace function t_owner(tname in varchar2)
      return varchar2  
    is
      oname table.owner%type;       --> declare a local variable which will be returned
    begin
      select owner into oname from table where table_name = tname;
      return oname;
    end;
    

    如果要使用OUT参数,切换到一个过程:

    create or replace procedure t_owner(tname in varchar2, oname out varchar2)
    is
    begin
      select owner into oname from table where table_name = tname;
    end;
    

    你可以这样称呼它

    declare
      l_out table.owner%type;
    begin
      t_owner('table_test', l_out);
      dbms_output.put_line(l_out);
    end;
    

    【讨论】:

    • 请更正table_name = tname;然后就可以了,谢谢帮助
    • 呸!当然,我复制/粘贴了您的代码,并没有注意到它是错误的。固定的。不客气。
    【解决方案2】:

    oname 应该是局部变量,而不是输出参数,tname 不应该作为字符串引用,而是作为输入参数引用。

    create or replace function t_owner(tname in varchar2)
    return varchar2
    is
        oname table.owner%type;
    begin
        select owner into oname 
        from table 
        where table_name = tname;
    
        return oname;
    end;
    
    select t_owner('table_test') from dual;
    

    【讨论】:

      【解决方案3】:

      函数是一个返回单个值的子程序,它隐式只返回一个输出值,因此,不需要定义为参数,已经使用return关键字指出。因此,您需要去掉第二个参数并将其转换为局部变量:

      create or replace function t_owner( tname mytable.table_name%type )
       return mytable.owner%type
      is
        oname mytable.owner%type;
      begin
        select owner into oname from mytable where table_name = tname;
        return oname;
      end;
      

      还有

      • 删除 select 语句中变量 tname 周围的引号,否则参数的存在将毫无意义。因为不会被使用。
      • 将变量显式定义为<table_name>.<column_name>%type,以强调它们的定义,以及相关表的数据类型或长度可能发生的概率。
      • 作为保留关键字,我将table 替换为mytable

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-08
        • 2013-06-23
        相关资源
        最近更新 更多