SELECT INTO 语句中的 ora-01422 错误

Posted

技术标签:

【中文标题】SELECT INTO 语句中的 ora-01422 错误【英文标题】:ora-01422 error in SELECT INTO statements 【发布时间】:2017-08-23 10:51:22 【问题描述】:

我的 Company_Person_all 视图中有一行,在 EMPLOYEE_NAME 列中以“YENER UZUN”命名(我已经只想要一个结果)。当我向这个函数发送参数时(fname,而不是使用'YENER UZUN')我遇到

ORA-01422:exact fetch returns more than requested number of rows ...

我应该怎么做才能防止这个错误?此外,当我编写下面的代码('YENER UZUN',而不是 fname)时,没关系,它不会给我一个错误。

FUNCTION Get_Calistigi_Santiye_By_Fname(fname IN varchar2)
    RETURN varchar2 
IS
    temp_ varchar2(100);
BEGIN
    select free_field6
    into   temp_
    from   company_person_all
    where  employee_name = 'YENER UZUN';

    DBMS_OUTPUT.put_line(temp_);
    RETURN temp_;
END;

【问题讨论】:

这不应该发生。你是如何调用函数并传入fname 值的? BEGIN dbms_output.put_line('something': '||company_person_api.Get_Calistigi_Santiye_By_Fname('YENER UZUN'));结尾; /* 像这样 */ 并且这段代码只返回一行给我... select * from Company_Person where employee_name ='YENER UZUN'; 调试它 - 更改过程以循环遍历返回的行并写出他们的employee_names和ROWIDs或类似的东西。 【参考方案1】:

我通过将“fname”参数名称更改为“xyz”解决了这个问题。 'fname' 被包中的其他过程和函数用作 RECORD 实例名称。 这样当我更改参数名称时,错误立即得到修复。

【讨论】:

我,至少不知道 Oracle 中名为 fname 的任何全局参数。 这是一个基于Oracle的ERP系统,名为IFS。我不明白为什么它完全解决了我的问题。但是改参数名不是开玩笑,它解决了这个错误。 不要跟随你不确定的。它现在可能对您有所帮助,但在其他地方会受到伤害。试试我的解决方案,看看是否可行。 您的函数没有使用fname,因此不清楚名称冲突是如何造成问题的。【参考方案2】:

大多数情况下,使用cursor 代替select .. into 是避免ORA-01422 的捷径,使用适当的order by(asc [默认] /desc) 子句,因为您的业务逻辑更喜欢哪个记录(lastfirst 记录),如下所示:

FUNCTION Get_Calistigi_Santiye_By_Fname( fname company_person_all.employee_name%type )
    RETURN company_person_all.free_field6%type 
IS
    temp_ company_person_all.free_field6%type;
BEGIN
  for c in
   (
    select free_field6 ff6
      from company_person_all
     where employee_name = fname --> 'YENER UZUN'
     order by work_date_time
   )
   loop
    temp_ :=  c.ff6;
   end loop;    
    dbms_output.put_line(temp_);

    RETURN temp_;
END;

【讨论】:

以上是关于SELECT INTO 语句中的 ora-01422 错误的主要内容,如果未能解决你的问题,请参考以下文章

mysql中select into 和sql中的select into 对比

insert into语句的语法错误

mysql 存储过程中的select into outfile语句生成的文件放哪里

PHP Array into mysql select 语句

使用 select 语句编写 Sql insert into 语句

Oracle 未找到多个 Select Into 语句的数据