[sql]petit probleme

petit probleme [sql] - SQL/NoSQL - Programmation

Marsh Posté le 29-05-2003 à 18:05:07    

Bonjour
 
pourriez vous a resoudre ce probleme
 
voici mon code

Code :
  1. REATE OR REPLACE PROCEDURE suppression_proc_groupe
  2. ( v_nom_du_groupe IN groupes.nom_du_groupe%TYPE)
  3. IS
  4. suppr_id_groupe NUMBER;
  5. BEGIN
  6. Select id_groupe
  7. into suppr_id_groupe
  8. from groupes
  9. where nom_du_groupe=v_nom_du_groupe;
  10. DELETE from albums
  11. where id_album=(select id_album
  12.                          from chansons
  13.                          where id_chanson IN (select id_chanson
  14.                                                       from chanteurs
  15.                                                       where id_groupe=(select id_groupe
  16.                                                                                 from groupes
  17.                                                                                 where nom_du_groupe=v_nom_du_groupe)));
  18.                                                    
  19. DELETE from chansons
  20. where id_chanson=(select id_chanson
  21.                              from chanteurs
  22.                              where id_groupe=(select id_groupe
  23.                                                          from groupes
  24.                                                          where nom_du_groupe=v_nom_du_groupe));
  25. DELETE from chanteurs
  26. where id_groupe=(select id_groupe
  27.                  from groupes
  28.                  where nom_du_groupe=v_nom_du_groupe);
  29. DELETE from groupes
  30. where nom_du_groupe=v_nom_du_groupe;
  31. END suppression_proc_groupe;


 
Et quand j'execute la procedure il me dit qu'il retourne trop de valeur au niveau du

Code :
  1. select id_album
  2.                          from chansons
  3.                          where id_chanson IN (select id_chanson
  4.                                                       from chanteurs


 
car des les chansons ont des id_chansons differents.
 
Quelqu'un a une idée.
 
Merci d'avance.

Reply

Marsh Posté le 29-05-2003 à 18:05:07   

Reply

Marsh Posté le 29-05-2003 à 23:08:22    

Je sais pas quel SGBD tu utilises, mais généralement, on met un ":" devant le nom des variables dans les requêtes...
 
 
Ca vient peut-être de là :??:

Reply

Marsh Posté le 29-05-2003 à 23:09:03    

Deplus, essaie de faire des jointures plutôt que des sous-requêtes à n'en plus finir...

Reply

Marsh Posté le 29-05-2003 à 23:12:13    

select id_album
from chansons
where id_chanson IN (
   select id_chanson
   from chanteurs
   where id_groupe=(
      select id_groupe
      from groupes
      where nom_du_groupe=v_nom_du_groupe
   )
)


 
Ca donne :
 

select c1.id_album
from chansons c1, chanteur c2, groupe g1
where c1.id_chanson = c2.id_chansons
and c2.id_goupe = g1.id_groupe
and g1.nom_du_goupe = v_nom_du_groupe

Reply

Marsh Posté le 29-05-2003 à 23:38:05    

la base de donnée est oracle ca vient pas de la conception du script.
 
Car en fait il peut pas traiter le truc car il me retourne trop de valeur.

Reply

Marsh Posté le 29-05-2003 à 23:44:18    

déjà, ça peut pas planter là où tu dis.
 
par contre, quand tu écris where id_groupe = (select ...)
 
Ca ne peut que planter : Oracle va même pas essayer de voir s'il y a 1 ou plusieurs lignes car la sous-requête peut syntaxiquement retourner plusieurs lignes...
 
Donc soit tu fais un IN, soit tu fais une fonction de regroupement sur l'IP, par exemple un max()
 
Mais de toute façon, y'a pas plus goret que ton code, passe par des jointures : ça sera plus propre, plus rapide, et il n'y aura pas de risque de plantage.

Reply

Marsh Posté le 29-05-2003 à 23:49:12    

limsa a écrit :

il peut pas traiter le truc car il me retourne trop de valeur.


 
trop de valeurs retournées, Oracle?
c surtout que tu fais un requete impossible à traiter... ta condition est mauvaise, ta sous requete renvoit plusieurs reponses, donc pas possible  [:spamafote]  
 
comme dis MagicBuzz, fais des jointures, je comprends pas tu te compliques la vie là... [:wawash]  
 


---------------
IVG en france
Reply

Marsh Posté le 30-05-2003 à 16:36:59    

voila j'ai trouvé c de faire un curseur
qui va effacer les valeurs sequentiellement.

Reply

Marsh Posté le 30-05-2003 à 19:22:55    

Où est-ce qu'on peut acheter des cordes ?
 
Non non, c'est pas pour me pendre, c'est pour attacher limsa, qu'il arrête le massacre :sarcastic:

Reply

Marsh Posté le 30-05-2003 à 23:25:31    

pkoi lol qu'ai-je fais de mal mdr

Reply

Marsh Posté le 30-05-2003 à 23:25:31   

Reply

Marsh Posté le 31-05-2003 à 01:11:10    

Bah parceque là t'es en train de traîter des pucerons au lance flamme.
 
Je te dis depuis le départ :
-> Réécrit proprement tes requêtes en utilisant des jointures, tu n'auras plus le bug, et surtout ça sera à la fois 1000 fois plus rapide, et 10E99999999999999 fois plus simple :D


Message édité par MagicBuzz le 31-05-2003 à 01:11:58
Reply

Marsh Posté le 31-05-2003 à 23:53:33    

Code :
  1. [cpp]CREATE OR REPLACE PROCEDURE suppression_proc_albums
  2. (
  3. v_nom_album IN albums.nom_album%TYPE)
  4. IS
  5. a_number  NUMBER :=0;
  6. suppr_id_album NUMBER;
  7. nombre NUMBER;
  8. chanson chanteurs.id_chanson%TYPE;
  9. CURSOR id_chansons_cursor IS
  10. select  ch.id_chanson
  11. from chanteurs ch, chansons c
  12. where ch.id_chanson = c.id_chanson
  13. and c.id_album = suppr_id_album;
  14. BEGIN
  15. SELECT id_album
  16. INTO suppr_id_album
  17. FROM albums
  18. WHERE nom_album = v_nom_album;
  19. select count(*)
  20. into nombre
  21. from chanteurs ch, chansons c
  22. where ch.id_chanson = c.id_chanson
  23. and c.id_album = suppr_id_album;
  24. OPEN id_chansons_cursor;
  25. LOOP
  26.               FETCH id_chansons_cursor INTO chanson;
  27.                   DELETE FROM chanteurs
  28.                   where id_chanson = chanson;
  29.                    a_number := a_number + 1;
  30. EXIT WHEN (a_number=nombre);
  31. END LOOP;
  32. CLOSE id_chansons_cursor;
  33. DELETE FROM   albums
  34. WHERE id_album = suppr_id_album;
  35. DELETE FROM chansons
  36. WHERE id_album = suppr_id_album;
  37. END suppression_proc_albums;
  38. /


 
c mieux comme ca nan ?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed