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
) 子句,因为您的业务逻辑更喜欢哪个记录(last 或 first 记录),如下所示:
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 对比
mysql 存储过程中的select into outfile语句生成的文件放哪里
PHP Array into mysql select 语句