2

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

我的查询如下:

    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;

我得到的输出如下:Declare * ERROR at line 1: ORA-01422: exact fetch returns more than requested number of rows ORA-06512: at line 7

我确信这与放入变量的返回值有关,但我不知道如何纠正这一点。

任何建议将不胜感激。

非常感谢。

4

4 回答 4

2

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

您的查询返回多个值主要是因为您使用的是group by. 在您的情况下, a 的作用是查找该列中每个不同值的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. 如果您只想获取 column 中所有非空值的计数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;
    /
    
于 2013-08-28T04:25:16.650 回答
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;
/

我还添加了使用批量收集的优化,因为这会给您带来稍快的性能。

于 2013-08-28T01:14:56.880 回答
1

错误在group by子句中。你得到了多行,count(registration)因为你已经使用group by了它。目前的临时解决方案是删除该group by子句。

于 2016-09-29T19:18:21.443 回答
0

这对我有用。我将隐式 SELECT 语句移动到循环游标中,并添加了一个 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;

非常感谢大家的帮助。

于 2013-08-28T20:07:35.307 回答