Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1493 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [sql]petit probleme

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[sql]petit probleme

n°411096
limsa
Posté le 29-05-2003 à 18:05:07  profilanswer
 

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.

mood
Publicité
Posté le 29-05-2003 à 18:05:07  profilanswer
 

n°411213
MagicBuzz
Posté le 29-05-2003 à 23:08:22  profilanswer
 

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à :??:

n°411214
MagicBuzz
Posté le 29-05-2003 à 23:09:03  profilanswer
 

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

n°411215
MagicBuzz
Posté le 29-05-2003 à 23:12:13  profilanswer
 

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

n°411227
limsa
Posté le 29-05-2003 à 23:38:05  profilanswer
 

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.

n°411242
MagicBuzz
Posté le 29-05-2003 à 23:44:18  profilanswer
 

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.

n°411246
uriel
blood pt.2
Posté le 29-05-2003 à 23:49:12  profilanswer
 

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
n°411599
limsa
Posté le 30-05-2003 à 16:36:59  profilanswer
 

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

n°411694
MagicBuzz
Posté le 30-05-2003 à 19:22:55  profilanswer
 

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:

n°411783
limsa
Posté le 30-05-2003 à 23:25:31  profilanswer
 

pkoi lol qu'ai-je fais de mal mdr

mood
Publicité
Posté le 30-05-2003 à 23:25:31  profilanswer
 

n°411799
MagicBuzz
Posté le 31-05-2003 à 01:11:10  profilanswer
 

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
n°412058
limsa
Posté le 31-05-2003 à 23:53:33  profilanswer
 

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 ?


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [sql]petit probleme

 

Sujets relatifs
[glib-2.0 / Makefile] petit problème d'inclusionUn petit probléme avec les methodes Static et Non-Static...
[Shell] Petit problème de greppetit problème d'externalisation de requete en java
Petit problème avec une classe[PHP] petit probleme avec boucle
[Q-Basic] petit probleme dans la compilation :(petit probleme en C...
Petit probleme avec JDomPHP petit probleme avec ce langage
Plus de sujets relatifs à : [sql]petit probleme


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR