Trigger
lemega
Messages postés
85
Date d'inscription
Statut
Membre
Dernière intervention
-
DROE Messages postés 148 Date d'inscription Statut Membre Dernière intervention -
DROE Messages postés 148 Date d'inscription Statut Membre Dernière intervention -
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
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
A voir également:
- Trigger
- Assistant trigger - Guide
1 réponse
Hello,
je pense que tu as 2 problèmes.
le premier :
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 :
DROE
L'expérience, c'est le nom que chacun donne à ses erreurs
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