首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >PL/SQLGroupby-Ora-01422:确切的fetch返回超过请求的行数

PL/SQLGroupby-Ora-01422:确切的fetch返回超过请求的行数
EN

Stack Overflow用户
提问于 2013-08-28 00:53:58
回答 4查看 11.6K关注 0票数 2

我正在写下面的查询,我想显示汽车登记,汽车组名称,型号名称,成本和每辆车的预订数量。我必须使用一个显式游标,我必须使用一个隐式游标来计算属于每辆车的预订数量。

我的查询如下:

代码语言:javascript
复制
    SET SERVEROUTPUT ON FORMAT WRAP SIZE 12000
Declare
v_count number;
cursor carcur IS
SELECT * FROM i_car;
v_car carcur%ROWTYPE;
Begin
Select COUNT (registration)
INTO v_count
from i_booking
group by registration;
FOR v_car IN carcur LOOP
DBMS_OUTPUT.PUT_LINE('Registration:'|| '  '|| v_car.registration);
DBMS_OUTPUT.PUT_LINE('Car Group:'|| ' ' ||v_car.car_group_name);
DBMS_OUTPUT.PUT_LINE('Model Name:'|| ' '||v_car.model_name);
DBMS_OUTPUT.PUT_LINE('Cost:'|| ' '||v_car.cost);
DBMS_OUTPUT.PUT_LINE('Total Bookings:'|| ' '||v_count);
DBMS_OUTPUT.NEW_LINE;

END LOOP;
End;

我得到的输出如下:在第1行声明*错误: ORA-01422:准确的提取返回大于请求的行数,或者-06512:在第7行

我确信这与变量中的返回值有关,但我不知道如何纠正这个问题。

如有任何建议,将不胜感激。

非常感谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-08-28 20:07:35

这对我起了作用。我将隐式SELECT语句移到游标for循环中,并添加了一个WHERE子句,该子句表示WHERE注册= v_car.registration;

代码语言:javascript
复制
SET SERVEROUTPUT ON FORMAT WRAP SIZE 12000
    Declare
    v_count number;
    cursor carcur IS
    SELECT * FROM i_car;
    v_car carcur%ROWTYPE;
    Begin
    FOR v_car IN carcur LOOP
    Select COUNT (registration)
    INTO v_count
    from i_booking
    WHERE registration = v_car.registration;
    DBMS_OUTPUT.PUT_LINE('Registration:'|| '  '|| v_car.registration);
    DBMS_OUTPUT.PUT_LINE('Car Group:'|| ' ' ||v_car.car_group_name);
    DBMS_OUTPUT.PUT_LINE('Model Name:'|| ' '||v_car.model_name);
    DBMS_OUTPUT.PUT_LINE('Cost:'|| ' '||v_car.cost);
    DBMS_OUTPUT.PUT_LINE('Total Bookings:'|| ' '||v_count);
    DBMS_OUTPUT.NEW_LINE;
    END LOOP;
    End;

非常感谢大家的帮助。

票数 0
EN

Stack Overflow用户

发布于 2013-08-28 04:25:16

您所面临的错误是因为您试图将多个值赋值给单个值变量。

查询返回多个值,主要是因为您使用的是group by。在您的示例中,group by所做的是为该列中的每个不同值查找registration列中值的总数。

假设,让我们看看一个例子-

代码语言:javascript
复制
registration | other columns ...
1            | ...
1            | ...
1            | ...
2            | ...
3            | ...
3            | ...

因此,使用group by查询的输出将是

代码语言:javascript
复制
registration | count(registration)
1            | 3
2            | 1
3            | 2

注意,列registration不是在select列表中选择的,而是只选择了count(registration),根据该示例,count(registration)可以包含多个值。

所以现在有三个案子-

  1. 如果上面是您想要的输出,那么clieu上面的答案是有用的。
  2. 如果希望只获取列registration中所有非空值的计数,只需删除group by子句即可。
  3. 如果要计算列registration中的所有registration非空值,可以使用count(distinct registration)并删除group by,如下所示: 在格式包装尺寸12000上设置SERVEROUTPUT,声明v_count号;选择光标carcur *来自i_car;v_car carcur%ROWTYPE;开始从i_booking选择计数(不同注册)到v_count;对于carcur循环DBMS_OUTPUT.PUT_LINE中的v_car (‘注册:’IN:‘SERVEROUTPUT’);DBMS_OUTPUT.PUT_LINE('Car组:‘number’%ROWTYPE);DBMS_OUTPUT.PUT_LINE('Model Name:‘AC.26:’||v_car.model_name '||v_car.model_name);“DBMS_OUTPUT.PUT_LINE”(‘成本:’分部‘'||v_car.cost);DBMS_OUTPUT.PUT_LINE(“总预订量:’{##**$$}”||v_count);DBMS_OUTPUT.NEW_LINE;END循环;End;//
票数 2
EN

Stack Overflow用户

发布于 2013-08-28 01:14:56

当从select计数(注册)返回多个值时,就会发生错误,因为您要将它选择到单个变量v_count中。

如果您试图选择各种注册的所有计数,则需要为v_count使用数组类型,如下所示:

代码语言:javascript
复制
declare
v_count number;
v_counts is table of v_count

Begin
    Select COUNT (registration)
    bulk collect INTO v_counts
    from i_booking
group by registration;

if (v_counts > 0) then
   for i in v_counts.first..last loop
    <do your printing>
   end loop;
end if;
end;
/

我还添加了一个使用大容量集合的优化,因为这将给您带来更快的性能。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18477741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档