Trigger compilé sans erreur mais ne fonctionne pas
waliddovi
Messages postés
2
Date d'inscription
Statut
Membre
Dernière intervention
-
waliddovi Messages postés 2 Date d'inscription Statut Membre Dernière intervention -
waliddovi Messages postés 2 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
j ai un petit probleme concernant un trigger qui apres un insert dans une table modifie les donees d une autre table, il se compile sans erreurs mais apres l insert , rien ne se modifie dans la deuxieme table, voila mes tables et mon trigger:
j ai un petit probleme concernant un trigger qui apres un insert dans une table modifie les donees d une autre table, il se compile sans erreurs mais apres l insert , rien ne se modifie dans la deuxieme table, voila mes tables et mon trigger:
CREATE TABLE Cpt ( idcompte VARCHAR(15) NOT NULL PRIMARY KEY, tipe VARCHAR(20) NOT NULL, nom_banque VARCHAR(20) NOT NULL, solde FLOAT NOT NULL, idclient INTEGER NOT NULL );
CREATE TABLE Op ( idoperation INTEGER NOT NULL PRIMARY KEY, type_operation VARCHAR(6) NOT NULL, date_operation Date NOT NULL, libelle VARCHAR(50) NOT NULL, somme FLOAT NOT NULL, idcompte VARCHAR(15) NOT NULL );
create or replace trigger Maj_compte before delete or update or insert on op for each row declare old_somme Op.somme%TYPE DEFAULT 0; somme_tmp Op.somme%TYPE DEFAULT 0; PRAGMA autonomous_transaction; begin IF DELETING THEN SELECT somme INTO somme_tmp FROM Op WHERE idoperation = :OLD.idoperation; UPDATE Cpt SET solde = (solde - somme_tmp) WHERE idcompte = ':OLD.idcompte'; END IF; IF INSERTING THEN SELECT somme INTO somme_tmp FROM Op WHERE idoperation = :NEW.idoperation; UPDATE Cpt SET solde = (solde + somme_tmp) WHERE idcompte = ':NEW.idcompte'; END IF; IF UPDATING THEN SELECT somme INTO old_somme FROM Op WHERE idoperation = :OLD.idoperation; IF old_somme > :OLD.somme THEN UPDATE Cpt SET solde = (solde - (old_somme - :OLD.somme)) WHERE idcompte = ':NEW.idcompte'; ELSE UPDATE cpt SET solde = (solde + (:OLD.somme - old_somme)) WHERE idcompte = ':NEW.idcompte'; END IF; END IF; EXCEPTION WHEN NO_DATA_FOUND THEN NULL; end Maj_compte;
A voir également:
- Trigger compilé sans erreur mais ne fonctionne pas
- Erreur 0x80070643 - Accueil - Windows
- Erreur 0x80070643 Windows 10 : comment résoudre le problème de la mise à jour KB5001716 - Accueil - Windows
- J'aime par erreur facebook notification - Forum Facebook
- Code erreur f3500-31 ✓ - Forum Bbox Bouygues
- Java code erreur 1603 ✓ - Forum Windows
1 réponse
Salut,
Ton code comporte il me semble plusieurs erreurs de logique.
1/ pour ton anomalie sur l'insert, tu as un trigger basé qui est before (avant) insert sur OP, donc l'enregistrement n'est pas encore enregistré dans la base, comment veux tu le retrouver par ton select ?
2/ plus globalement sur les 3 cas de maj d'OP, pourquoi faire un select dans la base pour retrouver la somme alors que tu as :OLD.somme et :NEW.somme
il suffit de faire :
3/ je n'ai pas compris sur l'update ton if sur la somme ??
Le 3ème update ci-dessus devrait suffire. Par contre, voir les contraintes fonctionnelles, il peut y avoir un test à faire si le idcompte de l'opération peut faire l'objet d'un changement. Il faudrait alors 2 update
Ton code comporte il me semble plusieurs erreurs de logique.
1/ pour ton anomalie sur l'insert, tu as un trigger basé qui est before (avant) insert sur OP, donc l'enregistrement n'est pas encore enregistré dans la base, comment veux tu le retrouver par ton select ?
2/ plus globalement sur les 3 cas de maj d'OP, pourquoi faire un select dans la base pour retrouver la somme alors que tu as :OLD.somme et :NEW.somme
il suffit de faire :
UPDATE cpt SET solde = (solde - :OLD.somme) ou UPDATE cpt SET solde = (solde + :NEW.somme) ou UPDATE cpt SET solde = (solde - :OLD.somme + :NEW.somme)
3/ je n'ai pas compris sur l'update ton if sur la somme ??
Le 3ème update ci-dessus devrait suffire. Par contre, voir les contraintes fonctionnelles, il peut y avoir un test à faire si le idcompte de l'opération peut faire l'objet d'un changement. Il faudrait alors 2 update
if :OLD.idcompte != :NEW.idcompte UPDATE cpt SET solde = (solde - :OLD.somme) sur :OLD.idcompte UPDATE cpt SET solde = (solde + :NEW.somme) sur :NEW.idcompte else UPDATE cpt SET solde = (solde - :OLD.somme + :NEW.somme)
waliddovi
Messages postés
2
Date d'inscription
Statut
Membre
Dernière intervention
merci énormément :D :D