【问题标题】:PL/sql function return an error of many rowsPL/sql 函数返回多行错误
【发布时间】:2019-07-03 05:06:25
【问题描述】:

此函数仅返回 VAC_NAME(但不返回这些名称的列表)

create or replace function FCT_VAC(NO_VAC in number)
return varchar2
is
V_lNAME varchar2(30);
begin
    select u.UTI_NAME ||' '|| u.UTI_L_NAME into V_lNAME  
    from USER_TAB u
      join DEAL_TAB d on u.USERNAME = d.USERNAME
;

return V_lNAME;
end FCT_VAC_NAME;
/
set serveroutput on;
select FCT_VAC_NAME(3) as Vacantion_Name from dual;

但如果我会简单选择

 select u.UTI_NAME, u.UTI_L_NAME  
 from USER_TAB u 
    join DEAL_TAB d on u.USERNAME = d.USERNAME
;

按预期工作,功能有什么问题?

【问题讨论】:

  • 因为在函数中一次只能返回一个(out)参数。在您的情况下,有两个连接。要单独返回它们,您需要一个过程。
  • @BarbarosÖzhan: 或流水线函数

标签: oracle plsql stored-functions


【解决方案1】:

查询返回两(或更多)行;它们不适合标量 v_lname varchar2(30) 变量。

问题是:您期望什么结果?只有一个值?然后确保查询返回它; WHERE 子句可能会有所帮助(尤其是当您传递参数但从不使用它时),例如

select u.UTI_NAME ||' '|| u.UTI_L_NAME 
into V_lNAME  
from USER_TAB u
  join DEAL_TAB d on u.USERNAME = d.USERNAME
where u.no_vac = p_no_vac;                      --> this

请注意,我已重命名参数;我不知道这些表中的任何一个是否包含no_vac 列,但是 - 如果包含 - 您最好为参数使用不同的名称。一种选择是为其添加前缀p_

否则,重写函数,使其返回其他内容(自定义类型、表格等)。

【讨论】:

  • 它必须从 u.UTI_NAME 返回值与 u.UTI_L_NAME 连接,所以我可以说,它需要返回两个合并的值
  • 这不是问题。我解释了什么是;查询返回多个
  • 好的,我需要从函数中删除什么,所以它会返回 1 行?
  • 我已经告诉过你了。添加 WHERE 子句。你不看人家说什么吗?
猜你喜欢
  • 1970-01-01
  • 2013-05-06
  • 1970-01-01
  • 1970-01-01
  • 2014-06-20
  • 1970-01-01
  • 2021-04-28
  • 1970-01-01
相关资源
最近更新 更多