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
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 ...
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
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
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 ...
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 !!!
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 !!!
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.
fais du bien à tous, du mal à personne !!
Pas d'aide concernant le code par MP, le forum est là pour ça :)
fais du bien à tous, du mal à personne !!
fais du bien à tous, du mal à personne !!
fais du bien à tous, du mal à personne !!
fais du bien à tous, du mal à personne !!