Partage
  • Partager sur Facebook
  • Partager sur Twitter

plusieurs requetes dans une procedure stockée

Sujet résolu
    9 février 2021 à 18:45:51

    Bonjour

    Je n'arrive pas à trouver l'erreur, j'ai crée plusieurs requettes dans une procedure stockée la voici:

    BEGIN

    SET @numClient = (SELECT IDCLIENT FROM clients WHERE RAISONSOCIALE LIKE nomClient);

    INSERT INTO projets(ABREGEPROJET,NOMPROJET,TYPEPROJET) values (abregeProjet,nomProjet,typeProjet);

    SET @numProjet = (SELECT CODEPROJET FROM projets WHERE NOMPROJET LIKE projets.NOMPROJET);

    INSERT INTO commander (IDCLIENT,CODEPROJET) VALUES (@numClient,@numProjet); 

    END

    or quand j'execute et que je mets les noms il me met erreur :SubQuery returns more than 1 row ,je suis debutante donc j''ai encore du mal

    • Partager sur Facebook
    • Partager sur Twitter
      10 février 2021 à 7:37:56 - Message modéré pour le motif suivant : Remarque prise en compte par l'équipe de modération


        10 février 2021 à 8:37:55

        Bonjour,

        Déplacement vers un forum plus approprié

        Le sujet est déplacé de la section PHP vers la section Base de données

        • Partager sur Facebook
        • Partager sur Twitter

        Pas d'aide concernant le code par MP, le forum est là pour ça :)

          10 février 2021 à 9:52:04

          Bonjour,

          nougat54 a écrit:

          SubQuery returns more than 1 row

          Cela signifie qu'une des requêtes SELECT de ta procédure retourne plus d'une ligne, et MySQL ne peut affecter plusieurs valeurs à une variable.

          Je suppose que cette requête :

          SELECT IDCLIENT FROM clients WHERE RAISONSOCIALE LIKE nomClient

          Retourne plusieurs valeurs ... essaye de l'exécuter dans la console (ou PHPMyAdmin) en remplaçant nomClient par la valeur qui fait planter la procédure.

          Au passage, il existe une fonction LAST_INSERT_ID() qui permet de simplifier ton insertion dans la table projet ;)

          BEGIN
          	SET @numClient = (
          		SELECT IDCLIENT
          		FROM clients
          		WHERE RAISONSOCIALE LIKE nomClient
          	);
          	
          	INSERT INTO projets( ABREGEPROJET, NOMPROJET, TYPEPROJET )
          	VALUES ( abregeProjet, nomProjet, typeProjet );
          	
          	SET @numProjet = LAST_INSERT_ID();
          
          	INSERT INTO commander ( IDCLIENT, CODEPROJET )
          	VALUES ( @numClient, @numProjet ); 
          END

          Dans tous les cas, il serait plus judicieux de proposer dans ton application une liste déroulante des clients avec leur id en valeur et leur nom en libellé, et d'exécuter la procédure directement avec l'id client choisi plutôt que son nom ... Ta procédure serait alors :

          BEGIN
          	INSERT INTO projets( ABREGEPROJET, NOMPROJET, TYPEPROJET )
          	VALUES ( abregeProjet, nomProjet, typeProjet );
          
          	INSERT INTO commander ( IDCLIENT, CODEPROJET )
          	VALUES ( idClient, LAST_INSERT_ID() ); 
          END

          -
          Edité par Benzouye 10 février 2021 à 9:55:18

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            10 février 2021 à 13:02:59

            Bonjour 

            merci pour votre réponse, j'ai reussi avec votre code 

                 BEGIN
             SET @numClient = ( SELECT IDCLIENT FROM clients
             WHERE RAISONSOCIALE = nomClient);
              INSERT INTO projets( ABREGEPROJET, NOMPROJET, TYPEPROJET )
              VALUES ( abregeProjet, nomProjet, typeProjet );
              SET @numProjet = LAST_INSERT_ID();
              INSERT INTO commander ( IDCLIENT, CODEPROJET )
             VALUES ( @numClient, @numProjet );
             END

            en remplacant like par = je ne vois pas pourquoi mais ca marche merci encore

            -
            Edité par nougat54 10 février 2021 à 13:31:57

            • Partager sur Facebook
            • Partager sur Twitter
              10 février 2021 à 15:30:13

              Imagine que dans ta table client tu ai :

              IDCLIENT RAISONSOCIALE

              123         RAYMOND PEINTURE

              456         RAYMOND

              Quand tu fais 
              SET @numClient = (SELECT IDCLIENT FROM clients WHERE RAISONSOCIALE LIKE 'RAYMOND');

              Tu retournes 2 rows dans le select et tu essayes de l'affecter à une seule variable => Erreur

              Si tu fais 
              SET @numClient = (SELECT IDCLIENT FROM clients WHERE RAISONSOCIALE = 'RAYMOND');

              Tu ne retournes qu'une seule ligne et l'affectation fonctionne comme prévu


              Je confirme l'idée de Benzouye : propose les noms dans ton application mais capte l'id lors de la sélection

              c'est IDCLIENT la PK de ta table pas RAISONSOCIALE

              • Partager sur Facebook
              • Partager sur Twitter
                12 février 2021 à 14:39:49

                merci MR01 je comprends mieux maintenant pourquoi , je vais essayer de faire ce que vous me conseillez merci encore à vous deux

                • Partager sur Facebook
                • Partager sur Twitter

                plusieurs requetes dans une procedure stockée

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown