Trigger compilé sans erreur mais ne fonctionne pas
waliddovi
Messages postés
2
Statut
Membre
-
waliddovi Messages postés 2 Statut Membre -
waliddovi Messages postés 2 Statut Membre -
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 4201 france tv ✓ - Forum Réseaux sociaux
- Erreur 4101 france tv - Forum Lecteurs et supports vidéo
- Code erreur f3500-31 ✓ - Forum Bbox Bouygues
- J'aime par erreur facebook notification - Forum Facebook
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
Statut
Membre
merci énormément :D :D