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

1

単一の変数 v_count に選択しているため、select count(registration) から複数の値が返されると、エラーが発生します。

さまざまな登録のすべてのカウントを選択しようとしている場合は、次のように 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 ステートメントをカーソル for ループに移動し、WHERE registration = v_car.registration; という WHERE 句を追加しました。

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 に答える