Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1526 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°674806
ludolitali​ano
Posté le 16-03-2004 à 10:06:48  profilanswer
 

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
mood
Publicité
Posté le 16-03-2004 à 10:06:48  profilanswer
 

n°674830
zyx
NCC - 1701
Posté le 16-03-2004 à 10:37:27  profilanswer
 

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

n°674835
ludolitali​ano
Posté le 16-03-2004 à 10:41:59  profilanswer
 

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
n°674836
thecoin
Chasseur de chasseur de canard
Posté le 16-03-2004 à 10:42:12  profilanswer
 

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

n°674841
thecoin
Chasseur de chasseur de canard
Posté le 16-03-2004 à 10:45:13  profilanswer
 

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
n°674842
zyx
NCC - 1701
Posté le 16-03-2004 à 10:45:35  profilanswer
 

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  ;)

n°674859
thecoin
Chasseur de chasseur de canard
Posté le 16-03-2004 à 11:06:13  profilanswer
 


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
n°675003
thecoin
Chasseur de chasseur de canard
Posté le 16-03-2004 à 13:40:23  profilanswer
 

Alors ca marche?  [:gugu]

n°675135
ludolitali​ano
Posté le 16-03-2004 à 15:32:51  profilanswer
 

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
n°675155
thecoin
Chasseur de chasseur de canard
Posté le 16-03-2004 à 16:01:51  profilanswer
 

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
mood
Publicité
Posté le 16-03-2004 à 16:01:51  profilanswer
 

n°675158
thecoin
Chasseur de chasseur de canard
Posté le 16-03-2004 à 16:08:01  profilanswer
 

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

n°675191
ludolitali​ano
Posté le 16-03-2004 à 16:46:14  profilanswer
 

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
n°675194
thecoin
Chasseur de chasseur de canard
Posté le 16-03-2004 à 16:50:23  profilanswer
 

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

n°675211
ludolitali​ano
Posté le 16-03-2004 à 17:20:25  profilanswer
 

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
n°675800
thecoin
Chasseur de chasseur de canard
Posté le 17-03-2004 à 08:33:09  profilanswer
 

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

n°675805
ludolitali​ano
Posté le 17-03-2004 à 08:47:40  profilanswer
 

Ca marche super !  :bounce:  
Bravo Thecoin !


---------------
Ludolitaliano
n°675812
thecoin
Chasseur de chasseur de canard
Posté le 17-03-2004 à 08:59:31  profilanswer
 

:sol: A votre service


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

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

 

Sujets relatifs
[Latex]Creation et insertion de fichiers .ps[oracle] Afficher tous les triggers.
[ Résolu ][ Borland ] Humilié par la portée de mes objets :whistle:Insertion de tag par javascript
[oracle] désactiver un trigger dans une procédure[Oracle 8i] UTL_FILE.GET_LINE exception
[Résolu] Formulaire d'upload et obligation de remplir toutes les casesRécupérer une id après insertion
[JAVA - JAVASCRIPT] Ouvrir la Sun Java Console [Résolu] 
Plus de sujets relatifs à : [RESOLU] [ORACLE] pb de trigger à l'insertion pl-sql


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR