“精确提取返回的行数超过了请求的行数”

Posted

技术标签:

【中文标题】“精确提取返回的行数超过了请求的行数”【英文标题】:"exact fetch returns more than requested number of rows" 【发布时间】:2017-03-28 17:22:03 【问题描述】:

我正在开发 Oracle Apex 5,当我尝试使用以下代码为一列运行应用程序时,我收到一条错误消息,提示“精确提取返回的行数超过请求的行数”

DECLARE
  Num VARCHAR2(40);
BEGIN
  SELECT CONCAT(YEAR, '-')
 INTO Num FROM APPS;
END;

【问题讨论】:

试试运行SELECT CONCAT(YEAR, '-') FROM MP_APPLICATIONS。你会看到它返回不止一行,显然不能放在一个变量中。你想得到任何一个值吗?可能是最大/最小? 【参考方案1】:

变量 terranumber 只能保存一个值。所以,如果你选择查询返回多行,就会抛出这个错误。

如果你想要任何一个值:

declare
    terranumber varchar2(40);
begin
    select concat(year, '-') into terranumber 
    from mp_applications
    where rownum = 1;
end;
/

也许你想得到max(或min)的年度:

declare
    terranumber varchar2(40);
begin
    select concat(max(year), '-') into terranumber 
    from mp_applications;
end;
/

或者您可能想一一访问所有值:

begin
    for rec in (select concat(year, '-') as year from mp_applications)
    loop
        -- use rec.year as required
    end loop;
end;
/

【讨论】:

当我使用 rownum 时,它只会从被调用的列中获取第一行(在 concat 中)。如何获取列的最新行? (TOP 和 LIMIT 不适用于 Oracle Apex 5) @thelamp 你可以使用 rownum 值:select * from (your select + order by date)where ROWNUM 【参考方案2】:

使用 INTO 子句时只能选择一行。通常,您添加 WHERE 子句条件以将返回的数据限制为仅一行。或者课程取决于你想要做什么。

【讨论】:

以上是关于“精确提取返回的行数超过了请求的行数”的主要内容,如果未能解决你的问题,请参考以下文章

尝试从两列中提取多条记录时,精确提取返回的行数超过了请求的行数

获取 ORA-01422 的原因:精确提取返回的行数超过了请求的行数

Oracle - ORA-01422:精确提取返回的行数超过了请求的行数

我在编程中不断遇到此问题

比较两个字段并在另一个表中返回不匹配的存储过程

PL/SQL ORA-01422 SELECT INTO 错误,Oracle 匿名块(NOVA 环境)