ludolitaliano | Bonjour, j'ai compilé un trigger "BEFORE INSERT" sans erreur de compilation :
Code :
- CREATE OR REPLACE TRIGGER T_ECICountries
- BEFORE INSERT ON ECICountries
- FOR EACH ROW
-
- DECLARE NbRows INTEGER;
-
- -- Affectation de la numérotation automatique pour l'identifiant du pays
- BEGIN
- SELECT S_ECICountries.NEXTVAL INTO :new.ECICountries_Id FROM DUAL;
-
- -- Si valeur manquante de pays
- IF (:new.ECICountries_ShortName='') OR (:new.ECICountries_ShortName=NULL) THEN
- -- On insère l'info dans table des logs
- INSERT INTO LogTable VALUES (SYSDATE, 'Valeur manquante ECICountries_ShortName : ','Valeur manquante','ECICountries',:new.ECICountries_Id, Null, 'Warning');
- -- Puis on insère 'NR' comme ShortName de pays
- :NEW.ECICountries_ShortName:='NR';
- END IF;
-
- -- Si nouvelle valeur de pays
- SELECT COUNT(*) INTO NbRows FROM ECICountries WHERE ECICountries_ShortName=:new.ECICountries_ShortName;
- IF NbRows=0 THEN
- -- On insère l'info dans table des logs
- INSERT INTO LogTable VALUES (SYSDATE, 'Nouvelle valeur ECICountries_ShortName : '|| :new.ECICountries_ShortName,'Nouvelle valeur','ECICountries',:new.ECICountries_Id, Null,'Warning');
- END IF;
- END;
|
Je peux insérer "à la main" une ligne dans la table concernée par ce trigger, sans erreur :
Code :
- INSERT INTO ECICountries (ECICountries_ShortName, ECICountries_Name) VALUES (FRA, 'FRANCE');
|
En revanche quand j'éxécute le code suivant :
Code :
- INSERT INTO ECICountries (ECICountries_ShortName, ECICountries_Name)
- SELECT DISTINCT T1.ECICOUNTRIES_NAME, T1.ECICOUNTRIES_NAME
- FROM ImportTable T1
- WHERE NOT EXISTS (SELECT * FROM ECICountries T2 WHERE T1.ECICOUNTRIES_NAME = T2.ECICountries_ShortName);
|
J'obtiens l'erreur suivante :
Citation :
ERROR at line 1: ORA-04091: table A013009.ECICOUNTRIES is mutating, trigger/function may not see it ORA-06512: at "A013009.T_ECICOUNTRIES", line 16 ORA-04088: error during execution of trigger 'A013009.T_ECICOUNTRIES'
|
Savez-vous ce que signifie exactement que la tables "is mutating" ?
Merci.
|