PL/SQL Group By - ORA-01422: exact fetch renvoie plus que le nombre requis de lignes
Je suis en train d'écrire la requête suivante que je veux afficher l'enregistrement de la voiture, de la voiture de nom du groupe, nom du modèle, le coût et le nombre de réservations pour chaque voiture. Je utiliser un curseur explicite et je dois utiliser un curseur implicite pour calculer le nombre de réservations qui appartiennent à chaque voiture.
Ma requête est la suivante:
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;
La sortie que je reçois est comme suit:
Déclarer
*
ERREUR à la ligne 1:
ORA-01422: exact fetch renvoie plus que le nombre requis de lignes
ORA-06512: à ligne 7
Je suis sûr qu'il a quelque chose à voir avec les valeurs de retour de la mettre dans la variable, mais je n'ai aucune idée de comment remédier à cela.
Tout conseil serait grandement apprécié.
Merci beaucoup.
Vous devez vous connecter pour publier un commentaire.
L'erreur, vous êtes confrontés est parce que vous essayez d'attribuer plusieurs valeurs à une seule valeur de la variable.
Votre requête retourne plusieurs valeurs principalement parce que vous êtes à l'aide d'un
group by
. Quelgroup by
n'est, dans votre cas, trouve le nombre total de valeurs dans la colonneregistration
pour chaque valeur distincte dans cette colonne.Supposons que, nous allons voir un exemple-
D'où la sortie de votre requête avec le
group by
seraitNoter que la colonne
registration
n'est pas sélectionnée dans votreselect
liste, seulementcount(registration)
est sélectionné, ce qui, selon l'exemple peut contenir plusieurs valeurs.Donc maintenant il y a trois cas maintenant-
Si ce qui précède est votre sortie désirée, clieu la réponse ci-dessus est utile.
Si vous souhaitez obtenir juste le nombre de toutes les valeurs non null dans la colonne
registration
, il suffit de retirer legroup by
clause et vous serez amende.Si vous souhaitez que le nombre de tous les
DISTINCT
les valeurs non null dans la colonneregistration
, vous pouvez utilisercount(distinct registration)
et supprimergroup by
comme suit:L'erreur se produit lorsque plus d'une valeur est retournée à partir de l'select count(enregistrement) puisque vous êtes à la sélection d'une seule variable v_count.
Si vous essayez de sélectionner tous les décomptes pour les différents enregistrements, vous aurez envie d'utiliser un tableau type pour v_count, comme ceci:
J'ai également ajouté dans une optimisation qui utilise un bloc de recueillir depuis que vous donnera un peu plus rapide de la performance.
l'erreur est dans le
group by
clause. Vous obtenez plusieurs lignes pourcount(registration)
parce que vous avez utiliségroup by
sur elle. La solution temporaire est de supprimer lagroup by
clause.Cela a fait l'affaire pour moi. J'ai déplacé mon implicite de l'instruction SELECT dans le curseur pour la boucle et a ajouté une clause where de dire OÙ enregistrement = v_car.inscription;
Merci beaucoup à tout le monde pour vous aider.