PL / SQL组By - ORA-01422:精确提取返回超过请求的行数

时间:2013-08-28 00:53:59

标签: sql oracle plsql oracle11g oracle10g

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

我的查询如下:

    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:精确提取返回超过请求的行数 ORA-06512:第7行

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

非常感谢任何建议。

非常感谢。

4 个答案:

答案 0 :(得分:2)

您面临的错误是因为您尝试将多个值分配给单个值变量。

您的查询返回多个值主要是因为您使用的是group by。在您的情况下,group by执行的操作是查找该列中registration列中每个不同值的值的总计数。

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

registration | other columns ...
1            | ...
1            | ...
1            | ...
2            | ...
3            | ...
3            | ...

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

registration | count(registration)
1            | 3
2            | 1
3            | 2

请注意,registration列表中未选中select列,仅选择count(registration),根据示例,该列可包含多个值。

因此现在有三种情况 -

  1. 如果以上是您想要的输出,clieu上面的答案很有用。

  2. 如果您只想获取registration列中所有非空值的计数,只需删除group by子句就可以了。

  3. 如果您想要计算DISTINCT列中所有registration非空值的计数,您可以使用count(distinct registration)并删除group by,如下所示:

    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 (DISTINCT registration)
    INTO v_count
    from i_booking;
    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 :(得分:1)

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

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

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;
/

我还添加了一个使用批量收集的优化,因为这样可以提高性能。

答案 2 :(得分:1)

错误在count(registration)子句中。您为group by获取了多行,因为您已使用group by。现在的临时解决方案是删除pandasdata = pandas.read_csv(r'\\mydrive\resource.csv') header = ["IP Address", "\xef\xbb\xbfComputer Name", "OS"] pandasdata.to_csv('localresources.csv', columns = header) 子句。

答案 3 :(得分:0)

这对我有用。我将隐式SELECT语句移动到游标for循环中,并添加了一个WHERE子句,说明WHERE registration = v_car.registration;

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;

非常感谢大家的帮助。