Trigger compilé sans erreur mais ne fonctionne pas

Fermé
waliddovi Messages postés 2 Date d'inscription mercredi 29 août 2018 Statut Membre Dernière intervention 29 août 2018 - Modifié le 29 août 2018 à 15:10
waliddovi Messages postés 2 Date d'inscription mercredi 29 août 2018 Statut Membre Dernière intervention 29 août 2018 - 29 août 2018 à 15:58
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:

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;

1 réponse

jee pee Messages postés 39649 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 26 avril 2024 9 238
Modifié le 29 août 2018 à 15:45
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 :

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)


0
waliddovi Messages postés 2 Date d'inscription mercredi 29 août 2018 Statut Membre Dernière intervention 29 août 2018
29 août 2018 à 15:58
merci énormément :D :D
0