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

DB2 Discussion :

Problème avec les délimiteurs dans un trigger


Sujet :

DB2

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Mai 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Problème avec les délimiteurs dans un trigger
    Bonjour à tous.

    Voilà le trigger que j'ai mis dans un fichier :
    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
    16
    CREATE TRIGGER LISTE_MODULES_OBL
        AFTER INSERT ON CONTRATS
        REFERENCING NEW AS N
        FOR EACH ROW
        BEGIN
            FOR RES AS
                SELECT ID_MODULE
                FROM FORMATIONS_MODULES
                WHERE ID_FORMATION = N.ID_FORMATION
                AND TYPE_MODULE = 1
            DO
                INSERT INTO CONTRATS_MODULES
                (ID_MODULE, ID_CONTRAT)
                VALUES (RES.ID_MODULE, N.ID_CONTRAT);
            END FOR;
        END
    Et voilà les erreurs que je me prends lorsque j'importe le fichier (db2 -tf "TRIGGERS.SQL") :
    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
    16
    17
    18
    19
    20
    DB21034E La commande a été traitée comme une instruction SQL car il ne s'agit
    pas d'une commande valide pour l'interpréteur de commandes.  Le message SQL
    suivant a été renvoyé lors de son traitement :
    SQL0104N Une marque inattendue "RES" figure à la suite de "BEGIN         FOR".
    Parmi  les marques attendues, on  trouve : "JOIN".  LINE NUMBER=6.
    SQLSTATE=42601
     
    DB21034E La commande a été traitée comme une instruction SQL car il ne s'agit
    pas d'une commande valide pour l'interpréteur de commandes.  Le message SQL
    suivant a été renvoyé lors de son traitement :
    SQL0104N Une marque inattendue "END-OF-STATEMENT" figure à la suite de "END
    FOR".  Parmi  les marques attendues, on  trouve : "JOIN <joined_table>".
    SQLSTATE=42601
     
    DB21034E La commande a été traitée comme une instruction SQL car il ne s'agit
    pas d'une commande valide pour l'interpréteur de commandes.  Le message SQL
    suivant a été renvoyé lors de son traitement :
    SQL0104N Une marque inattendue "END-OF-STATEMENT" figure à la suite de "END
    TERMINATE".  Parmi  les marques attendues, on  trouve : "JOIN <joined_table>".
    SQLSTATE=42601
    J'ai installé le DB2 Express-C gratuit pour Windows. J'ai d'autres triggers avec lesquels j'ai eu des problèmes : en fait dès que je mets autre chose que WHEN (....) SQLSTATE '....' (.....); (par exemple si je place tout dans un bloc BEGIN ... END) j'ai des erreurs du type celles ci-dessus.

    Edit : je précise que j'ai fait un copier/coller d'un trigger par défaut de DB2 (POLICY_DR je crois) que j'ai ensuite importé et j'ai des erreurs du même type ; il doit certainement y avoir un truc qui m'échappe.

    Pouvez-vous m'aider SVP ?

  2. #2
    jab
    jab est déconnecté
    Rédacteur
    Avatar de jab
    Homme Profil pro
    SharePoint developpeur
    Inscrit en
    Février 2004
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : SharePoint developpeur
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 1 173
    Points : 4 339
    Points
    4 339
    Par défaut
    Je ne sais pas si cela va résoudre ton problème mais il me semble qu'il ne faut pas le ; derrière le End For

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Mai 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par jab
    Je ne sais pas si cela va résoudre ton problème mais il me semble qu'il ne faut pas le ; derrière le End For
    Ca ne change rien, toujours le même type d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    DB21034E La commande a été traitée comme une instruction SQL car il ne s'agit
    pas d'une commande valide pour l'interpréteur de commandes.  Le message SQL
    suivant a été renvoyé lors de son traitement :
    SQL0104N Une marque inattendue "END-OF-STATEMENT" figure à la suite de "ODULE,
    N.ID_CONTRAT)".  Parmi  les marques attendues, on  trouve :
    "<delim_semicolon>".  LINE NUMBER=14.  SQLSTATE=42601
     
    DB21034E La commande a été traitée comme une instruction SQL car il ne s'agit
    pas d'une commande valide pour l'interpréteur de commandes.  Le message SQL
    suivant a été renvoyé lors de son traitement :
    SQL0104N Une marque inattendue "FOR" figure à la suite de "END ".  Parmi  les
    marques attendues, on  trouve : "JOIN <joined_table>".  SQLSTATE=42601

  4. #4
    jab
    jab est déconnecté
    Rédacteur
    Avatar de jab
    Homme Profil pro
    SharePoint developpeur
    Inscrit en
    Février 2004
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : SharePoint developpeur
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 1 173
    Points : 4 339
    Points
    4 339
    Par défaut
    Et quelque chose comme cela ?

    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
    16
     
    CREATE TRIGGER LISTE_MODULES_OBL
        AFTER INSERT ON CONTRATS
        REFERENCING NEW AS N
        FOR EACH ROW
        BEGIN ATOMIC
            WITH RES AS
             (SELECT ID_MODULE
                FROM FORMATIONS_MODULES
                WHERE ID_FORMATION = N.ID_FORMATION
                AND TYPE_MODULE = 1
             )
            INSERT INTO CONTRATS_MODULES
                (ID_MODULE, ID_CONTRAT)
                VALUES (RES.ID_MODULE, N.ID_CONTRAT);
        END

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Mai 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci de ton aide. Mais toujours pareil
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    DB21034E La commande a été traitée comme une instruction SQL car il ne s'agit
    pas d'une commande valide pour l'interpréteur de commandes.  Le message SQL
    suivant a été renvoyé lors de son traitement :
    SQL0104N Une marque inattendue "CONTRATS_MODULES" figure à la suite de "
    INSERT INTO".  Parmi  les marques attendues, on  trouve : "<space>".  LINE
    NUMBER=12.  SQLSTATE=42601
     
    DB21034E La commande a été traitée comme une instruction SQL car il ne s'agit
    pas d'une commande valide pour l'interpréteur de commandes.  Le message SQL
    suivant a été renvoyé lors de son traitement :
    SQL0104N Une marque inattendue "END-OF-STATEMENT" figure à la suite de "END
    TERMINATE".  Parmi  les marques attendues, on  trouve : "JOIN <joined_table>".
    SQLSTATE=42601
    J'ai pas l'impression que le problème viennent d'une erreur de syntaxe car ce trigger fonctionne :
    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
    16
    17
    CREATE TRIGGER NB_MODULES_MAX
        NO CASCADE BEFORE
        INSERT ON CONTRATS_MODULES
        REFERENCING NEW AS N
        FOR EACH ROW MODE DB2SQL
        WHEN (
              (SELECT COUNT(*)
               FROM CONTRATS_MODULES
               WHERE ID_CONTRAT = N.ID_CONTRAT) + 1 >
              (SELECT NB_MODULES
               FROM FORMATIONS
               WHERE ID_FORMATION = (SELECT ID_FORMATION
                                     FROM FORMATIONS
                                     WHERE ID_CONTRAT = N.ID_CONTRAT))
             )
        SIGNAL SQLSTATE '85101'
            ('Nombre de modules maximum atteint pour ce contrat.');
    Par contre si j'ai le malheur d'encercler le SIGNAL STATE d'un BEGIN ... END je me reprends le même type d'erreur. Il y a un truc que je comprends pas.

Discussions similaires

  1. Problème avec les apostrophes dans le sql en VBA
    Par cyrilboulan dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 14/03/2017, 10h11
  2. [SimpleXML] Problème avec les accents dans le XML
    Par trotters213 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 18/12/2006, 10h23
  3. Réponses: 8
    Dernier message: 15/12/2006, 17h15
  4. Problème avec les espaces dans un tableau !
    Par remixtech dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 10/07/2006, 19h30
  5. [MFC] problème avec les insertions dans CComboBox
    Par Joeleclems dans le forum MFC
    Réponses: 12
    Dernier message: 11/06/2004, 15h31

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