Partage
  • Partager sur Facebook
  • Partager sur Twitter

variable sql

affecter le résultat d'un requête SQL dans une variable

Sujet résolu
    29 mai 2020 à 13:06:58

    bonjour à tous je travail sur un projet c# utilisant une base de données MYSQL, je veux créer un trigger sur une table MYSQL dans ce trigger :

    • je dois récupérer la valeur d'une d'une requête ;
    • l'utiliser dans une autre requête(INSERT);

    Q1. Je savoir s'il y a moyen d'affecter le résultat d'une requête SQL dans une variable ???? 

    Q2. si OUI comment procéder ????

    MON PROBLEME SE TROUVE SUR LA LIGNE 18.

    MERCI D'AVANCE !!!!

    delimiter |
    create trigger before_insert_depots_transaction after insert
    	on depots for each row
    BEGIN
    declare v_id smallint ;
    declare v_client varchar(50);
    declare v_operation enum('depot','retrait');
    declare v_montant double(10,2);
    declare v_devise enum('CDF','USD');
    
     -- inialisation des variable --
     
     
     set v_id=new.id;
     set operation='depot';
     set v_montant=new.montant_depot;
     set v_devise=new.devise;
     set v_client = select concat_ws(' ',nom,postnom,prenom) as client from clients where id in(select client_id from comptes  );
     
    
    	if new.montant_depot is not null 
    		AND new.montant_depot > 0
        THEN
        
            insert into transaction(id,dateheure,client,operation,montant,devise) 
            values(,,,,,)
    	end if ;
    END |



    -
    Edité par TheophileKapapa 29 mai 2020 à 13:09:26

    • Partager sur Facebook
    • Partager sur Twitter

    fais du bien à tous, du mal à personne !!

      2 juin 2020 à 11:23:57

      Le rapport avec .NET ?

      Comme chaque SGBDR a son propre dialect SQL, je te conseille d'aller sur un forum dédié à MySQL.

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
        2 juin 2020 à 11:54:48

        Bonjour,

        Déplacement vers un forum plus approprié

        Le sujet est déplacé de la section Langages.NET 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 :)

          2 juin 2020 à 12:44:56

          Bonjour,

          TheophileKapapa a écrit:

          Q1. savoir s'il y a moyen d'affecter le résultat d'une requête SQL dans une variable ???? 

          Q2. si OUI comment procéder ????

          Oui, la syntaxe est :

          SELECT colonne1 INTO ma_variable
          FROM ...

          Après tu n'as besoin que d'une seule variable ici ... et je ne pense pas que ta requête SELECT te permette de ne récupérer qu'un seul client ...

          Je te propose de simplifier le code ainsi :

          delimiter |
          
          CREATE TRIGGER before_insert_depots_transaction
          AFTER INSERT ON depots
          FOR EACH ROW
          BEGIN
          	DECLARE v_client varchar(50);
          	
          	SELECT CONCAT_WS( ' ', CL.nom, CL.postnom, CL.prenom ) INTO v_client
          	FROM
          		clients CL
          			INNER JOIN comptes CO
          				ON CL.compte_id = CO.id
          	WHERE CO.id = NEW.compte_id;
          	
          	IF NEW.montant_depot IS NOT NULL
          		AND NEW.montant_depot > 0
          	THEN
          		INSERT INTO transaction ( id, dateheure, client, operation, montant, devise )
          		VALUES( NEW.id, NOW(), v_client, 'depot', NEW.montant_depot, NEW.devise );
          	END IF;
          END |
          
          DELIMITER ;

          Attention, j'ai imaginé la jointure client/compte ... à vérifier sur les noms de colonne ...

          Maintenant, cela me paraît complètement loufoque de faire un tel TRIGGER, les données sont dupliquées (donc dénormalisées) dans la table transaction ... Pour moi il y a une table en trop ou un problème de conception ...

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            5 juin 2020 à 10:22:26

            merci pour vos réponses mais j'ai trouvé la solution :

            mon problème était que  MYSQL WORKBENCH soulignait cette ligne de la requête 

            j'ai résolu ce problème en mettant le requête entre parenthèse comme suit :

            delimiter |
            create trigger before_insert_depots8_transaction after insert
            	on depots for each row
            BEGIN
            declare v_id smallint ;
            declare v_client varchar(50);
            declare v_operation enum('depot','retrait');
            declare v_montant double(10,2);
            declare v_devise enum('CDF','USD');
            
             -- inialisation des variable --
             
             set v_id=new.id;
             set v_operation='depot';
             set v_montant=new.montant_depot;
             set v_devise=(select max( cpt.devise)  from comptes as cpt inner join depots as dpt On cpt.id=dpt.comptes_id where cpt.id=new.comptes_id);
             set v_client = (select max( cl.nom) from clients as cl inner join comptes as cpt on cl.id=cpt.client_id inner join depots as dpt on cpt.id=dpt.id where cpt.id=new.comptes_id);
             
            	if new.montant_depot is not null 
            		AND new.montant_depot > 0
                THEN
                
                    insert into transaction(id,dateheure,client,operation,montant,devise) values(v_id,current_timestamp(),v_client,v_operation,v_montant,v_devise);
            	end if ;
            END |



            -
            Edité par TheophileKapapa 5 juin 2020 à 10:31:55

            • Partager sur Facebook
            • Partager sur Twitter

            fais du bien à tous, du mal à personne !!

              5 juin 2020 à 10:46:47

              Ok pour la solution, même si elle n'est pas celle prévue normalement par le langage SQL ...

              Et quand est-il des autres remarques ?

              • Partager sur Facebook
              • Partager sur Twitter
              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                5 juin 2020 à 10:56:33

                Benzouye a écrit:

                Ok pour la solution, même si elle n'est pas celle prévue normalement par le langage SQL ...

                Et quand est-il des autres remarques ?


                Merci pour toutes les remarques !!!!

                ce que vous avez dit à-propos d'une table de plus c'est vrai mais je l'ai créée expressément pour m'aider à simplifier mes requette de selection sur les deux tables Depots et retrait qui n'ont pas la même structure ; parce que en utilisant UNION  cela renverrait une erreur. 

                j'ai modifié également ma requête comme suit :

                 set v_client = (select max( cl.nom) from clients as cl inner join comptes as cpt on cl.id=cpt.client_id inner join depots as dpt on cpt.id=dpt.id where cpt.id=new.comptes_id);

                -
                Edité par TheophileKapapa 5 juin 2020 à 10:58:13

                • Partager sur Facebook
                • Partager sur Twitter

                fais du bien à tous, du mal à personne !!

                  5 juin 2020 à 12:33:36

                  Si tu as des dépôts et des retraits avec des données différentes pour chacun, en toute rigueur il aurait fallut mettre en place une structure d'héritage.

                  Une table mère transaction avec les attributs commun aux deux types de transaction, et deux tables filles dépôt et retrait avec seulement les colonnes spécifiques à chacun ...

                  Cela aurait été plus "propre" ...

                  Par ailleurs la méthode "officielle" pour initialiser une variable à partir d'une requête reste le SELECT ... INTO ...

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                    5 juin 2020 à 12:46:23

                    Benzouye a écrit:

                    Si tu as des dépôts et des retraits avec des données différentes pour chacun, en toute rigueur il aurait fallut mettre en place une structure d'héritage.

                    Une table mère transaction avec les attributs commun aux deux types de transaction, et deux tables filles dépôt et retrait avec seulement les colonnes spécifiques à chacun ...

                    Cela aurait été plus "propre" ...

                    Par ailleurs la méthode "officielle" pour initialiser une variable à partir d'une requête reste le SELECT ... INTO ...

                    Merci pour le temps tu m'accordes sinon j'apprécie les idées éclaircissantes que tu viens de me donner. en faites pour ce qui concerne la structure d'héritage je sais comment le faire Sous c# mais je ne sais pas le faire sur MYSQL.

                    j'ai suivi "le cours Administrez vos base de données avec MYSQL" de Chantal G. je n'ai pas vu les notions d'Héritage !!!

                    pourriez-vous me montrer comment procéder ???? 

                    • Partager sur Facebook
                    • Partager sur Twitter

                    fais du bien à tous, du mal à personne !!

                      5 juin 2020 à 12:56:00

                      https://sqlpro.developpez.com/cours/modelisation/heritage/

                      Mais les dépôt et les retraits sont si différents que ça ? C'est surprenant ...

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                        5 juin 2020 à 13:53:41

                        Benzouye a écrit:

                        https://sqlpro.developpez.com/cours/modelisation/heritage/

                        Mais les dépôt et les retraits sont si différents que ça ? C'est surprenant ...

                        Merci je viens de comprendre dans l'article que vous venez de dédier, en faite c'était question de comprendre comment transformer les entités qui contiennent l'héritage sous le Model logique de données Relationnel. Donc comme vous l'avez dit c'est UN PROBLEME DE CONCEPTION.

                         Merci !!!

                        • Partager sur Facebook
                        • Partager sur Twitter

                        fais du bien à tous, du mal à personne !!

                        variable sql

                        × 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