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 Procédural MySQL Discussion :

traitement conditionnel dans trigger


Sujet :

SQL Procédural MySQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 37
    Points : 19
    Points
    19
    Par défaut traitement conditionnel dans trigger
    Bonjour à tous,

    N'ayant pas trouvé ma réponse sur le web, je me permet de poster mon problème ici.

    Voici ce que je voudrais faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    CREATE TRIGGER nom_trigger BEFORE INSERT ON nom_table
     
    BEGIN
      IF NEW.uneValeur IS NOT NULL
          THEN [plein de commandes du type delete, insert, ...]
      ELSE
          [plein de commande du type delete, insert, ...]
      END IF
    END

    Je n'ai pas trouvé le moyen d’exécuter telle ou telle commande en fonction de la valeur d'un paramètre.

    Une idée?
    Peut-être que ma façon de voir les choses n'est pas adapté au langage SQL?

    Merci d'avance

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 127
    Points : 208
    Points
    208
    Par défaut
    Bonjour silexia,

    Tu peux parfaitement faire ce que tu souhaites, mais il y a juste un petit piège :
    Le statement de IF THEN ELSE END IF doit se terminer par un point virgule.
    Or généralement, quand on cree le trigger, le point virgule sert à dire que c'est la fin de la déclaration du triger.
    L'astuce est toute simple (quand on la connait, c'est pas moi qui l'ai trouvée)
    changer temporairement le délimiteur comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    DELIMITER //
    CREATE TRIGGER T_CONDITION
    AFTER INSERT ON deslogin
    FOR EACH ROW BEGIN
       IF (NEW.login LIKE 'A%') THEN
         UPDATE basetestb.facture f SET f.comment = '10' WHERE f.id = 44;
       ELSE
         UPDATE basetestb.facture f SET f.comment = '50' WHERE f.id = 44;
       END IF;
    END//
    DELIMITER;
    J'ai testé ce code sur une base mysql 5.0 et ça fonctionne

    Cordialement

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 37
    Points : 19
    Points
    19
    Par défaut
    Merci beaucoup pour ta réponse !! En effet j'étais tombé dans le piège...

    Par contre je n'arrive toujours pas a créer mon trigger.

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    DELIMITER //
    CREATE TRIGGER accounts_oppotrunities_insert2_t BEFORE INSERT ON opportunities_cstm
    FOR EACH ROW BEGIN
    	IF (NEW.account_id_c IS NOT NULL) THEN
    		DELETE FROM accounts_opportunities 
    			WHERE opportunity_id=NEW.id_c AND account_id = NEW.account_id_c;
    		INSERT 	INTO accounts_opportunities (id,opportunity_id,account_id,date_modified,deleted) 
    				SELECT UUID(),NEW.account_id_c,NEW.id;
    	END IF;
    END//
    DELIMITER;
    Version mysql : 5.0.41-community-nt

    retour d'erreur :

    Erreur

    Il semble qu'il y ait une erreur dans votre requête SQL. Le message ci-bas peut vous aider à en trouver la cause.

    ERROR: Ponctuation invalide @ 11
    STR: //
    SQL: DELIMITER //
    CREATE TRIGGER accounts_oppotrunities_insert2_t BEFORE INSERT ON opportunities_cstm
    FOR EACH ROW BEGIN
    IF (NEW.account_id_c IS NOT NULL) THEN
    DELETE FROM accounts_opportunities
    WHERE opportunity_id=NEW.id_c AND account_id = NEW.account_id_c;DELIMITER //
    CREATE TRIGGER accounts_oppotrunities_insert2_t BEFORE INSERT ON opportunities_cstm
    FOR EACH ROW BEGIN
    IF (NEW.account_id_c IS NOT NULL) THEN
    DELETE FROM accounts_opportunities
    WHERE opportunity_id=NEW.id_c AND account_id = NEW.account_id_c;DELIMITER //
    CREATE TRIGGER accounts_oppotrunities_insert2_t BEFORE INSERT ON opportunities_cstm
    FOR EACH ROW BEGIN
    IF (NEW.account_id_c IS NOT NULL) THEN
    DELETE FROM accounts_opportunities
    WHERE opportunity_id=NEW.id_c AND account_id = NEW.account_id_c;DELIMITER //
    CREATE TRIGGER accounts_oppotrunities_insert2_t BEFORE INSERT ON opportunities_cstm
    FOR EACH ROW BEGIN
    IF (NEW.account_id_c IS NOT NULL) THEN
    DELETE FROM accounts_opportunities
    WHERE opportunity_id=NEW.id_c AND account_id = NEW.account_id_c;DELIMITER //
    CREATE TRIGGER accounts_oppotrunities_insert2_t BEFORE INSERT ON opportunities_cstm
    FOR EACH ROW BEGIN
    IF (NEW.account_id_c IS NOT NULL) THEN
    DELETE FROM accounts_opportunities
    WHERE opportunity_id=NEW.id_c AND account_id = NEW.account_id_c;


    requête SQL:

    DELIMITER // CREATE TRIGGER accounts_oppotrunities_insert2_t BEFORE INSERT ON opportunities_cstm FOR EACH ROW BEGIN IF (NEW.account_id_c IS NOT NULL) THEN DELETE FROM accounts_opportunities WHERE opportunity_id=NEW.id_c AND account_id = NEW.account_id_c;

    MySQL a réponduocumentation
    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELIMITER //
    CREATE TRIGGER accounts_oppotrunities_insert2_t BEFORE INSERT ON o' at line 1


    Merci

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 127
    Points : 208
    Points
    208
    Par défaut
    Bonjour silexia,

    tu y étais presque, il manque juste les parenthese pour entourer le select comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT 	INTO accounts_opportunities (id,opportunity_id,account_id,date_modified,deleted) 
    				(SELECT UUID(),NEW.account_id_c,NEW.id);
    Cordialement

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 37
    Points : 19
    Points
    19
    Par défaut
    Encore merci pour ta rapidité. Il se trouve que ce ne marchait toujours pas. Mais j'ai trouvé le problème.
    C'est le mot clé DELIMITER qu'il n'aimait pas (allez savoir pourquoi).

    J'ai alors remarqué que l'IHM de phpMyAdmin permettait de définir le délimiteur lors de l'exécution d'une requête. J'ai donc enlevé les commandes DELIMITER :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    CREATE TRIGGER accounts_oppotrunities_insert2_t BEFORE INSERT ON opportunities_cstm
    FOR EACH ROW BEGIN
    	IF (NEW.account_id_c IS NOT NULL) THEN
    		DELETE FROM accounts_opportunities 
    			WHERE opportunity_id=NEW.id_c AND account_id = NEW.account_id_c;
    		INSERT 	INTO accounts_opportunities (id,opportunity_id,account_id,date_modified,deleted) 
    				(SELECT UUID(),NEW.account_id_c,NEW.id_c);
    	END IF;
    END//
    J'ai ensuite précisé à phpMyAdmin que je voulais que le délimiteur soit // et là ça a fonctionné...



    Je met en résolu même si il y a encore une petite part de mystère.

    Merci pour ton aide semaphore

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Points : 622
    Points
    622
    Par défaut
    Il faut un espace :

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 127
    Points : 208
    Points
    208
    Par défaut
    Bonjour et bien vu Fred 34
    Ce qui m'a trompé c'est que sous Toad for Mysql ça marche sans l'espace, par contre sous PHPMyadmin et sous mysql ligne de commande il faut l'espace.
    Bravo aussi à silexia qui a su se débrouiller avec une correction un peu bancale

    Cordialement

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

Discussions similaires

  1. Update dans Trigger
    Par Te-Deum dans le forum Développement
    Réponses: 3
    Dernier message: 07/02/2020, 14h31
  2. Variable OUTPUT dans Trigger
    Par Yanmeunier dans le forum Développement
    Réponses: 4
    Dernier message: 09/12/2005, 13h38
  3. Réponses: 2
    Dernier message: 28/09/2005, 09h47
  4. [VB.NET] Affichage conditionnel dans un repeater
    Par NicoNGRI dans le forum ASP.NET
    Réponses: 4
    Dernier message: 07/02/2005, 12h58
  5. [PL/SQL] Appel procédure stockée dans trigger
    Par Félia dans le forum Oracle
    Réponses: 3
    Dernier message: 24/01/2005, 17h25

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