[RESOLU] [ORACLE] pb de trigger à l'insertion pl-sql

pb de trigger à l'insertion pl-sql [RESOLU] [ORACLE] - SQL/NoSQL - Programmation

Marsh Posté le 16-03-2004 à 10:06:48    

J'essaie de créer un trigger à l'insertion. La partie "Before update" fonctionne bien seule. Le code du trigger exécuté :
 

Code :
  1. CREATE OR REPLACE TRIGGER T_ECICountries
  2.     -- Affectation de la numérotation automatique pour l'identifiant du pays
  3.     BEFORE INSERT ON ECICountries
  4.     FOR EACH ROW
  5.     BEGIN
  6.       SELECT S_ECICountries.NEXTVAL INTO :NEW.ECICountries_Id FROM DUAL;
  7.     END;
  8.    
  9.     AFTER INSERT ON ECICountries
  10.     FOR EACH ROW
  11.     -- Si valeur manquante de pays on insère l'info dans table des logs
  12.     WHEN (NEW.ECICountries_ShortName="" )
  13.     BEGIN
  14.         INSERT INTO LogTable VALUES (SYSDATE, 'Valeur manquante de pays : ', 'Valeur manquante', 'ECICountries', NewRow.ECICountries_Id, Null, 'Warning');
  15.     END;
  16.    
  17.      -- Si nouvelle valeur de pays on insère l'info dans table des logs
  18.     WHEN (NEW.ECICountries_ShortName NOT IN (SELECT ECICountries_Name FROM ECICountries))
  19.     BEGIN
  20.         INSERT INTO LogTable VALUES (SYSDATE, 'Nouvelle valeur de pays : ' || NewRow.ECICountries_Name, 'Nouvelle valeur', 'ECICountries', NewRow.ECICountries_Id, Null, 'Warning');
  21.     END;


 
Me donne comme message :

Citation :

Warning: Trigger created with compilation errors.


 
Je ne vois pas l'erreur. Auriez-vous une idée ?
Merci.


Message édité par ludolitaliano le 17-03-2004 à 08:48:37

---------------
Ludolitaliano
Reply

Marsh Posté le 16-03-2004 à 10:06:48   

Reply

Marsh Posté le 16-03-2004 à 10:37:27    

J'ai pas compris cette ligne:
 
SELECT S_ECICountries.NEXTVAL INTO :NEW.ECICountries_Id FROM DUAL;
 
Peux-tu m'éclairer dessus?

Reply

Marsh Posté le 16-03-2004 à 10:41:59    

Ca c'est une ligne qui marche bien. Elle conciste à affecter une nouvelle valeur pour l'identifiant ECICountries_Id à partir de la séquence S_ECICountries que j'ai créée plus haut dans le code.
La table DUAL est une table "virtuelle" qui permet de gérer les séquences. Le champ NEXTVAL (en opposition à CURRVAL qui retourne la valeur courante) est la valeur suivante de la séquence. Par défaut ça commence à 1 avec un incrément de 1.


---------------
Ludolitaliano
Reply

Marsh Posté le 16-03-2004 à 10:42:12    

WHEN est utilisé avec EXEPTION, dans ton cas il faut utiliser IF.

Reply

Marsh Posté le 16-03-2004 à 10:45:13    

De plus, il me semble que tu ne peut pas faire un BEFORE INSERT et un AFTER INSERT dans un meme trigger. Il faut en faire 2.


Message édité par thecoin le 16-03-2004 à 10:46:19
Reply

Marsh Posté le 16-03-2004 à 10:45:35    

ludolitaliano a écrit :

Ca c'est une ligne qui marche bien. Elle conciste à affecter une nouvelle valeur pour l'identifiant ECICountries_Id à partir de la séquence S_ECICountries que j'ai créée plus haut dans le code.
La table DUAL est une table "virtuelle" qui permet de gérer les séquences. Le champ NEXTVAL (en opposition à CURRVAL qui retourne la valeur courante) est la valeur suivante de la séquence. Par défaut ça commence à 1 avec un incrément de 1.


 
Je connaissais DUAL, mais pas cette méthode pour affecter une valeur!
Je vien d'apprendre un truc  ;)

Reply

Marsh Posté le 16-03-2004 à 11:06:13    


CREATE OR REPLACE TRIGGER T_ECICountries  
BEFORE INSERT ON ECICountries  
FOR EACH ROW  
 
     DECLARE
      countries ECICountries.ECICountries_Name%TYPE;
       
      -- 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 on insère l'info dans table des logs  
      IF :new.ECICountries_Name='' THEN
          INSERT INTO LogTable VALUES (SYSDATE, 'Valeur manquante de pays : ','Valeur manquante','ECICountries',:new.ECICountries_Id, Null, 'Warning');  
      END IF;  
       
       -- Si nouvelle valeur de pays on insère l'info dans table des logs  
      SELECT NVL(ECICountries_Name,'')  
      INTO countries
      FROM ECICountries
      WHERE ECICountries_Name=:new.ECICountries_Name;
       
      IF countries='' THEN
          INSERT INTO LogTable VALUES (SYSDATE, 'Nouvelle valeur de pays : '||:new.ECICountries_Name,'Nouvelle valeur','ECICountries',:new.ECICountries_Id, Null,'Warning');  
      END IF;
END;  


Message édité par thecoin le 17-03-2004 à 08:30:39
Reply

Marsh Posté le 16-03-2004 à 13:40:23    

Alors ca marche?  [:gugu]

Reply

Marsh Posté le 16-03-2004 à 15:32:51    

Merci beaucoup pour vos informations, j'ai appris des choses. Mais ça ne marche toujours pas. J'ai toujours ce "très explicite" message d'erreur.  :pt1cable:


---------------
Ludolitaliano
Reply

Marsh Posté le 16-03-2004 à 16:01:51    

Tu travail sous SQL+? Essayes de faire un SHOW ERROR aprés le message d'erreur.


Message édité par thecoin le 16-03-2004 à 16:02:06
Reply

Marsh Posté le 16-03-2004 à 16:01:51   

Reply

Marsh Posté le 16-03-2004 à 16:08:01    

Si tu peux nous donner la structure de la table LogTable et ECICountries?

Reply

Marsh Posté le 16-03-2004 à 16:46:14    

Avec SHOW ERRORS ça me dit :

Citation :

Errors for TRIGGER T_ECICOUNTRIES:
 
LINE/COL ERROR
-------- -----------------------------------------------------------------
19/7     PLS-00103: Encountered the symbol "IF" when expecting one of the
         following:
         . ( * @ % & - + ; / at for mod rem <an exponent (**)> and or
         group having intersect minus order start union where connect
         || indicator
         The symbol ";" was substituted for "IF" to continue.
 
 
Warning: Trigger created with compilation errors.


 
La structure de la table est :

Code :
  1. -- LogTable : Table des compte-rendus d'import
  2. create table LogTable (
  3.     "Date"    date          not null,
  4.     "Log"     Varchar2(200) not null,
  5.     "Type"    Varchar2(30)  not null,
  6.     TableName Varchar2(50)  null,
  7.     Id1    Number(6)   null,
  8. Id2    Number(6)  null,
  9.     Status    Varchar2(15)  not null
  10.     )
  11.     Storage (Initial 50K Next 1K);
  12.     comment on table LogTable is 'Table des messages d''erreur d''import';


---------------
Ludolitaliano
Reply

Marsh Posté le 16-03-2004 à 16:50:23    

Quel blairô j'avais oublié un ;  :sweat:  
 
J'ai corrigé le code tu peux reessayer

Reply

Marsh Posté le 16-03-2004 à 17:20:25    

Je suis un blaireau de n'avoir pas vu qu'il manquait un";".
Bon maintenant ça me dit :

Citation :

CREATE OR REPLACE TRIGGER T_ECICountries
                          *
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-01400: cannot insert NULL into ("SYS"."OBJ$"."NAME" )


 
Pourtant si j'éxécute :

Code :
  1. INSERT INTO LogTable VALUES (SYSDATE, 'Valeur manquante de pays : ','Valeur manquante','ECICountries', Null, Null, 'Warning');

Ca marche très bien.


Message édité par ludolitaliano le 16-03-2004 à 17:38:30

---------------
Ludolitaliano
Reply

Marsh Posté le 17-03-2004 à 08:33:09    

J'ai refait des modifs dans le code tu peux reessayes, ca doit venir de " qu'il faut remplacer par '.

Reply

Marsh Posté le 17-03-2004 à 08:47:40    

Ca marche super !  :bounce:  
Bravo Thecoin !


---------------
Ludolitaliano
Reply

Marsh Posté le 17-03-2004 à 08:59:31    

:sol: A votre service

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed