PL/sql 函数返回多行错误

Posted

技术标签:

【中文标题】PL/sql 函数返回多行错误【英文标题】:PL/sql function return an error of many rows 【发布时间】: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: 或流水线函数 【参考方案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 子句。你不看人家说什么吗?

以上是关于PL/sql 函数返回多行错误的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL 函数:从函数中提取多行

如何在 pl/sql 过程中使用游标返回多行和多列?

如何在 pl/sql 函数中的变量中存储多行?

如何编写 PL 以返回通过服务总线中的 DB 适配器自动生成强类型 XSD 的多行? (甲骨文 PL/SQL)

在 pl/sql 函数中选择子句返回错误值

用于遍历多行的 Oracle PL/SQL 函数