IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

Trigger (simple en principe)


Sujet :

SQL Oracle

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut Trigger (simple en principe)
    Bonjour,

    Je lutte pas mal car je débute en SQL.

    Au final, je vais devoir faire mon trigger sur un base Ingres sous UNIX mais c'est tellement galère pour tester que je m'exerce dans un premier temps sur une base Oracle via Toad.

    Ce que je veux faire :
    tab_test1 contient les champs id, champ1, champ2
    tab_test2 contient les champs id, champ1, champ2
    Je veux un trigger qui mette à jour les champ1 & champ2 de la table tab_test2 quand champ1 ou champ2 (mis à 0 au départ) sont différents de 0.



    Alors j'ai essayé tout un tas de choses, des scripts simples (ci-dessous on a même pas la condition sur un des 2 champs qui devient non-nul pour simplifier) comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE OR REPLACE TRIGGER T_tab_test2  
    AFTER INSERT ON tab_test1 
    FOR EACH ROW
    begin
    UPDATE tab_test2 SET tab_test2.champ1=tab_test1.champ1, tab_test2.champ2=tab_test1.champ2
    WHERE tab_test2.id=tab_test1.id
    end;
    J'ai aussi essayé de me servir du générateur de trigger de Toad mais ça génère une horreur incompréhensible qui ne marche même pas

  2. #2
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Faut utiliser (outre les balises code ) l'indicateur :NEW pour récupérer les valeurs qui sont insérées

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE OR REPLACE TRIGGER T_tab_test2  
    AFTER INSERT ON tab_test1 
    FOR EACH ROW
    begin
    UPDATE tab_test2 SET tab_test2.champ1=:new.champ1, tab_test2.champ2=:new.champ2
    WHERE tab_test2.id=:new.id
    end;

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    OK, j'ai donc rajouté les "new" mais je n'ai pas d'autre information de la part de TOAD que "Warning: TRIGGER created with compilation errors."
    Donc pour savoir ce qui cloche...

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Comme je n'ai pas la moindre idée de ce qui ne va pas, j'essaie d'autres syntaxes glanées ici et là...

    par rapport à ce que je veux maintenant, voilà ce que j'essaie mais qui ne marche pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE OR REPLACE TRIGGER T_tab_test2
    AFTER UPDATE ON tab_test1 t1
    REFERENCING NEW AS n  
    FOR EACH ROW 
    WHEN t1.champ1 IS NOT NULL OR t1.champ2 IS NOT NULL
    BEGIN
    	UPDATE tab_test2 SET champ1=:champ1, champ2=:n.champ2 
    	WHERE id=:n.id;			   
    	EXCEPTION     
    	  WHEN OTHERS THEN
    	       RAISE;
    END ;

  5. #5
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    essaye sous SQL*Plus en faisant SHOW ERR après la compil et regarde dans le forum pour le reste

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Citation Envoyé par orafrance Voir le message
    essaye sous SQL*Plus en faisant SHOW ERR après la compil
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    ORA-04079: invalid trigger specification
    Errors for TRIGGER T_TAB_TEST2
     
    LINE/COL ERROR                                                            
    -------- -----------------------------------------------------------------
    3/29     PL/SQL: ORA-00933: SQL command not properly ended                
    2/1      PL/SQL: SQL Statement ignored                                    
    4/4      PLS-00103: Encountered the symbol "end-of-file" when expecting on
             e of the following:                                              
                begin case declare end exception exit for goto if loop mod    
                null pragma raise return select update while with             
                <an identifier> <a double-quoted delimited-identifier>        
                <a bind variable> << close current delete fetch lock insert   
                open rollback savepoint set sql execute commit forall merge   
                <a single-quoted SQL string> pipe
    --> ???????????


    Citation Envoyé par orafrance Voir le message
    et regarde dans le forum pour le reste
    C'est justement ce que je fais depuis quelques heures en adaptant à mes tests les syntaxes qui sont postées.

  7. #7
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Le RAISE ne sert à rien déjà

    et :champ1 je vois mal comment ça peut marcher

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE OR REPLACE TRIGGER T_tab_test2
    AFTER UPDATE ON tab_test1 t1
    REFERENCING NEW AS n  
    FOR EACH ROW 
    WHEN t1.champ1 IS NOT NULL OR t1.champ2 IS NOT NULL
    BEGIN
    	UPDATE tab_test2 SET champ1=:n.champ1, champ2=:n.champ2 
    	WHERE id=:n.id;		
    END ;
    /

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 354
    Points : 436
    Points
    436
    Par défaut
    S'il faut prendre en considération la question originale alors il faut une condition permettant de vérifier si la valeur du champs est différent de 0
    Consultant et formateur Oracle

  9. #9
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    yep

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHEN NVL(t1.champ1,0) <> 0 NVL(t1.champ2,0) <> 0

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Mince, un message pour rien, le :champ1 au lieu de :n.champ1, c'était juste une erreur au moment de la recopie dans le forum mais j'avais bien écrit comme il faut, ce n'est donc pas ça.

    J'ai également remplacé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHEN t1.champ1 IS NOT NULL OR t1.champ2 IS NOT NULL
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHEN NVL(t1.champ1,'0') <> '0' NVL(t1.champ2,'0') <> '0'
    (il s'agit de VARCHAR2)

    Mais toujours ça :

    ORA-04079: invalid trigger specification
    Errors for TRIGGER T_TAB_TEST2

    LINE/COL ERROR
    -------- -----------------------------------------------------------------
    3/29 PL/SQL: ORA-00933: SQL command not properly ended
    2/1 PL/SQL: SQL Statement ignored
    4/4 PLS-00103: Encountered the symbol "end-of-file" when expecting on
    e of the following:
    begin case declare end exception exit for goto if loop mod
    null pragma raise return select update while with
    <an identifier> <a double-quoted delimited-identifier>
    <a bind variable> << close current delete fetch lock insert
    open rollback savepoint set sql execute commit forall merge
    <a single-quoted SQL string> pipe

  11. #11
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    c'est peut-être l'alias qui pose problème... que donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE OR REPLACE TRIGGER T_tab_test2
    AFTER UPDATE ON tab_test1
    REFERENCING NEW AS n  
    FOR EACH ROW 
    WHEN NVL(champ1,'0') <> '0' NVL(champ2,'0') <> '0'
    BEGIN
    	UPDATE tab_test2 SET champ1=:n.champ1, champ2=:n.champ2 
    	WHERE id=:n.id;		
    END ;
    /

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Eh non... quelle galère pour savoir ce qui ne va pas (je développe du C++ sous Visual d'habitude, alors ça me change d'univers ça!).

    Donc ce n'est pas l'alias...(j'ai même essayé d'enlever l'alisa du new mais pas plus)

  13. #13
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    moi j'aimerais bien voir la fenêtre SQL*Plus avec le code copié dedans pour être sûr qu'il y a pas de confusion... parce qu'apparemment y'a pas d'erreur et end-of-file normalement c'est qu'en présence d'un / ou retour à la ligne malencontreux

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 354
    Points : 436
    Points
    436
    Par défaut
    Citation Envoyé par orafrance Voir le message
    c'est peut-être l'alias qui pose problème... que donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE OR REPLACE TRIGGER T_tab_test2
    AFTER UPDATE ON tab_test1
    FOR EACH ROW 
    WHEN NVL(new.champ1,'0') <> '0' OR  NVL(new.champ2,'0') <> '0'
    BEGIN
    	UPDATE tab_test2 SET champ1=:new.champ1, champ2=:new.champ2 
    	WHERE id=:new.id;		
    END ;
    /
    C'est OR qui manque dans la clause WHEN ...
    Bon je corrige le code
    Consultant et formateur Oracle

  15. #15
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    arg... copier/coller raté

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    J'ai été voir et peut-être que l'erreur était due à un ancien trigger qui était resté.
    Bref, j'ai supprimé les 2 trigger et recréé celui dont on parle et je n'ai plus que ça comme erreur (bien que "no erreur"), ça n'update rien du tout quand je modifie mon tab_test.champ1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ORA-00906: missing left parenthesis
    No errors.

  17. #17
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Bon, voilà la syntaxe finale qui marche.
    Merci infiniment orafrance pour ton aide!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE OR REPLACE TRIGGER T_tab_test2
    AFTER UPDATE ON tab_test1
    --REFERENCING NEW AS n  
    FOR EACH ROW 
    WHEN (NVL(new.champ1,'0') <> '0' OR NVL(new.champ2,'0') <> '0')
    BEGIN
        UPDATE tab_test2 SET champ1=:new.champ1, champ2=:new.champ2
        WHERE id=:new.id;
    END ;
    /

  18. #18
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    J'ai juste un dernier soucis : si je fais un update sur ma table1, le trigger se déclenche et met à jour ma table2 mais la table1 n'est pas mise à jour

  19. #19
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    c'est impossible... t'as bien fait le COMMIT ?

  20. #20
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Hum, en fait ma table n'était pas rafraîchie (je découvre TOAD aussi...)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Tester un trigger simple
    Par danone88 dans le forum PL/SQL
    Réponses: 3
    Dernier message: 12/03/2013, 17h50
  2. Trigger Simple mysql
    Par Qwerty111 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 23/05/2011, 11h36
  3. Trigger simple INSERT/UPDATE
    Par castorcharly dans le forum Développement
    Réponses: 6
    Dernier message: 12/11/2010, 14h54
  4. Aide Trigger simple
    Par Cyrille36 dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 14/10/2008, 21h59
  5. Simple Trigger before on insert.
    Par gregb34 dans le forum Oracle
    Réponses: 7
    Dernier message: 28/05/2006, 07h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo