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 :

[TRIGGER] Une erreur que j'arrive pas à résoudre..


Sujet :

SQL Procédural MySQL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 46
    Points : 33
    Points
    33
    Par défaut [TRIGGER] Une erreur que j'arrive pas à résoudre..
    Bonjour à tous,

    j'ai un soucis pour créer un trigger, on me remonte une erreur sur la boucle pourtant la syntaxe est bonne...

    Sur la ligne "get_info: loop"

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    DELIMITER $$
    CREATE TRIGGER DELETE_EXP
    BEFORE DELETE
    ON t_exposant_exp
    FOR EACH ROW
    BEGIN
     
    	DECLARE oeuvre_id VARCHAR(100);
            DECLARE curseur CURSOR FOR 
            SELECT oeu.oeu_id FROM t_exposant_exp exp
    	INNER JOIN t_compte_cpt cpt on cpt.org_id = exp.org_id
    	LEFT JOIN t_presente_pre pre on pre.exp_id = exp.exp_id
    	LEFT JOIN t_oeuvre_oeu oeu on oeu.oeu_id = pre.oeu_id
    	LEFT JOIN t_catalogue_cat cat on cat.exp_id = exp.exp_id
    	where exp.exp_id = OLD.exp_id;
     
    	OPEN curseur;
     
    	get_info: LOOP
     
    	FETCH curseur INTO oeuvre_id;
     
    	IF oeuvre_id NOT IN (oeu_id FROM Oeu_collectives_or_not) then
     
    	DELETE FROM `t_oeuvre_oeu` WHERE `oeu_id` = oeuvre_id;
    	DELETE FROM `t_presente_pre` WHERE `oeu_id`= oeuvre_id;
     
    	END IF;
     
    	END LOOP get_info;
     
    	DELETE FROM `t_catalogue_cat` WHERE `exp_id`=OLD.exp_id;
     
     
    END;
    $$
    DELIMITER ;
    Merci d'avance

  2. #2
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 344
    Points : 18 919
    Points
    18 919
    Par défaut
    Salut Phobizeur.

    Je trouve votre trigger un peu lourd, fonctionnellement parlant.
    Il aurait été préférable de faire une procédure stockée, et de l'appeller depuis un trigger.

    Vous accéder à des tables qui n'ont pas lieu d'être dans votre requête (le curseur).
    En simplifiant la requête, voici ce que l'on obtient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
                 SELECT  oeu.oeu_id
                   FROM  t_exposant_exp     AS exp
     
        LEFT OUTER JOIN  t_presente_pre     AS pre
                     on  pre.exp_id = exp.exp_id
     
        LEFT OUTER JOIN  t_oeuvre_oeu       AS oeu
                     on  oeu.oeu_id = pre.oeu_id
     
                  where  exp.exp_id = OLD.exp_id;
    Ensuite, votre test d'existence n'est pas très performant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IF oeuvre_id NOT IN (oeu_id FROM Oeu_collectives_or_not then
    Déjà, il manque le "select" dans la clause "in". Ceci pourrait devenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (select 1 from FROM Oeu_collectives_or_not where oeu_id != _oeuvre_id) then
    Ce qui donne en regroupant mes deux remarques :
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    DROP TRIGGER IF EXISTS `DELETE_EXP`;
     
    DELIMITER $$
     
    CREATE TRIGGER `DELETE_EXP`
    BEFORE DELETE ON `t_exposant_exp`
    FOR EACH ROW
    BEGIN
      DECLARE _oeuvre_id  VARCHAR(255);
     
      DECLARE _fin       INTEGER DEFAULT 1;
      DECLARE curseur    CURSOR FOR
                 SELECT  oeu.oeu_id
                   FROM  t_exposant_exp     AS exp
     
        LEFT OUTER JOIN  t_presente_pre     AS pre
    	             on  pre.exp_id = exp.exp_id
     
        LEFT OUTER JOIN  t_oeuvre_oeu       AS oeu
                     on  oeu.oeu_id = pre.oeu_id
     
                  where  exp.exp_id = OLD.exp_id;
     
        OPEN  curseur;
        FETCH curseur INTO _oeuvre_id;
     
        WHILE (_fin)
        DO 
          IF (select 1 from FROM Oeu_collectives_or_not where oeu_id != _oeuvre_id) THEN
             DELETE FROM `t_oeuvre_oeu`   WHERE `oeu_id` = _oeuvre_id;
             DELETE FROM `t_presente_pre` WHERE `oeu_id` = _oeuvre_id;
          END IF;
     
          FETCH curseur INTO _oeuvre_id;
        END WHILE;
     
        DELETE FROM `t_catalogue_cat` WHERE `exp_id` = OLD.exp_id;
    END$$
     
    DELIMITER ;
    Cela n'a pas été testé. C'est juste une mise en forme.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 46
    Points : 33
    Points
    33
    Par défaut
    Merci beaucoup Artemus24 pour la réponse qui m'a permis d'apprendre 2-3 trucs !

    Finalement, j'ai opté effectivement pour une procédure.

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    DELIMITER $$
    CREATE procedure DELETE_EXP(IN exp_idd INT)
    BEGIN
     
    	DECLARE oeuvre_id VARCHAR(100);
        DECLARE cmpt INT;
            DECLARE curseur CURSOR FOR 
            SELECT oeu.oeu_id FROM t_exposant_exp exp
    	INNER JOIN t_compte_cpt cpt on cpt.org_id = exp.org_id
    	LEFT JOIN t_presente_pre pre on pre.exp_id = exp.exp_id
    	LEFT JOIN t_oeuvre_oeu oeu on oeu.oeu_id = pre.oeu_id
    	LEFT JOIN t_catalogue_cat cat on cat.exp_id = exp.exp_id
    	where exp.exp_id = exp_idd;
     
    	OPEN curseur;
     
    	LOOP
     
    	FETCH curseur INTO oeuvre_id;
     
        SET cmpt = (SELECT (count(*)) FROM oeu_collectives_or_not WHERE oeu_id=oeuvre_id.oeu_id);
     
    	IF cmpt < 1 THEN
     
    	DELETE FROM t_oeuvre_oeu WHERE oeu_id = oeuvre_id.oeu_id;
    	DELETE FROM t_presente_pre WHERE oeu_id = oeuvre_id.oeu_id;
     
    	END IF;
     
    	END LOOP;
     
    	DELETE FROM t_catalogue_cat WHERE exp_id = exp_idd;
    	DELETE FROM t_exposant_exp WHERE exp_id = exp_idd;
     
    END;
    $$
    DELIMITER ;
    Encore merci !

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/12/2012, 10h41
  2. Réponses: 1
    Dernier message: 29/01/2010, 10h33
  3. Erreur que j'arrive pas à comprendre
    Par badreddine540 dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 18/08/2008, 16h07
  4. une erreur que je saisi pas
    Par gipfel11 dans le forum C
    Réponses: 4
    Dernier message: 07/03/2008, 00h07
  5. Une erreur que j'arrive pas a comprendre
    Par olifile dans le forum Windows Forms
    Réponses: 2
    Dernier message: 03/05/2007, 14h41

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