Jamais de SELECT sur la table du trigger en FOR EACH ROW
Pourquoi faire 3 SELECT alors qu'un seul suffirait ? Essaye toujours de limiter les lectures aux tables.
Tu aurais pu faire
SELECT Ocompte, Omontant, Osens into code, mont, sens FROM Operation WHERE Oidd=:new.Oidd;
Tu as un trigger AFTER INSERT sur la table, donc tu as les données insérées en variables référencées par :new.nom_colonne. Tu l'a bien saisi pour Oidd, pourquoi vouloir refaire un select pour avoir Ocompte, Omontant et Osens ?
Enfin, pourquoi mettre le trigger en Autonomous_transaction ? Ca me semble inutile dans ce trigger.
1 2 3 4 5 6 7 8 9 10 11 12
| CREATE OR REPLACE TRIGGER SHOT
AFTER INSERT ON OPERATION
FOR EACH ROW
DECLARE
BEGIN
IF :NEW.Osens = 'c'
THEN
UPDATE COMPTE SET Csolde = Csolde + :NEW.Omontant WHERE Cid= :NEW.Ocompte;
ELSE
UPDATE COMPTE SET Csolde = Csolde - :NEW.Omontant WHERE Cid= :NEW.Ocompte;
END IF;
END; |
Améliorations :
Attention aux valeurs NULL pour Csolde et Omontant (mettre des NVL)
Il peut être utile de vérifier que la ligne COMPTE n'est pas lockée avant de faire l'update.
Partager