Trigger

Fermé
lemega Messages postés 85 Date d'inscription mardi 13 janvier 2009 Statut Membre Dernière intervention 31 mai 2023 - 29 juin 2012 à 19:36
DROE Messages postés 148 Date d'inscription mardi 5 mai 2009 Statut Membre Dernière intervention 26 juillet 2012 - 29 juin 2012 à 20:44
Bonjour à tous, j'ai un souci lors de l'execution de mon trigger
j'ai une table Emp qui contient ces variables :

empno NUMBER(6),
ename CHAR(15),
job CHAR(15),
mgr NUMBER(6),
datehire DATE,
sal NUMBER(15,2), -----le salaire
comm NUMBER(15,2), -----la commission
deptno NUMBER(6),

Il s'agit ici de créer un trigger qui permettra augmenter de 10% le salaire (SAL) des employés dont la commission (COMM) est supérieure à 50% du salaire.

Voici le code que j'ai fait :

CREATE TRIGGER TrigAugSal
BEFORE INSERT ON Emp
FOR EACH ROW

DECLARE
v_sal Emp.sal%TYPE;
v_comm Emp.comm%TYPE;
BEGIN
SELECT sal, deptno INTO v_sal, v_comm
FROM Emp WHERE sal = :NEW.sal;
IF (v_comm > :NEW.sal*0.5) THEN
UPDATE Emp SET sal = sal * 1.1 WHERE sal = :NEW.sal;
END IF;
END;
/

et lorsque je fais une insertion les erreurs suivantes me sont renvoyées :
ORA-01422 : l'extraction exacte ramène plus que le nombre de ligne demandé
ORA-06512 : à "lemega.TRIDAUGSAL", ligne 5
ORA-04088 : erreur lors d'exécution du déclencheur 'lemega.trigaugsal'

j'ai modifié ensuite mon code au niveau de "IF (v_comm > :NEW.sal*0.5)" en enlevant le :NEW

mais les erreurs aparaissaint à l'insertion

NB: je précise que les 2 triggers ont été créés sans retour d'erreur

Alors comment resoudre ce problème???
Merci





1 réponse

DROE Messages postés 148 Date d'inscription mardi 5 mai 2009 Statut Membre Dernière intervention 26 juillet 2012 48
Modifié par DROE le 29/06/2012 à 20:50
Hello,

je pense que tu as 2 problèmes.

le premier :

SELECT sal, deptno INTO v_sal, v_comm  
FROM Emp WHERE sal = :NEW.sal;

Ici tu as l'erreur ORA-01422 car cette requête (sans utiliser de Cursor) doit impérativement retourner 1 seul enregistrement et ici il t'en retournera plus d'un si plusieurs salariés ont ce même salaire.

http://www.dba-ora.fr/article-oracle-plsql-select-into-statement-73250860.html
http://www.dba-ora.fr/article-oracle-plsql-no_data_found-too_many_rows-exceptions-74004716.html

Le deuxième problème:

A chaque insertion de ligne tu vas augmenter le salaire de plusieurs salariés et cela plusieurs fois. (de plus tu ne pourras déclencher un update sur une table qui à déclencher le trigger, donc pas d'update sur emp)

je pense que tu veux augmenter le salaire de la ligne que tu insères uniquement:

dans ce cas c'est en changeant la valeur des :NEW :

CREATE TRIGGER TrigAugSal  
BEFORE INSERT ON Emp  
FOR EACH ROW  

BEGIN  
IF (:NEW.comm > :NEW.sal*0.5) THEN  
 :NEW.sal  :=  :NEW.sal*1.1;  
END IF;  
END;  
/ 



DROE

L'expérience, c'est le nom que chacun donne à ses erreurs
2