Partage
  • Partager sur Facebook
  • Partager sur Twitter

Trigger qui ne compile pas

    1 juin 2020 à 16:16:18

    Bonjour les gens,

    j'ai créer un prototype d'outils de traitement de texte dont une partie servira à écrire des scénarios(livre, film, pièce de théâtre, BD, jeu vidéo, etc.). Dans ma base chaque œuvres est divisée en actes(dont le type varie selon le format(chapitre, partie, niveaux, etc.) certain type d'actes peuvent même être des sous-partie d'un autre type d'acte) et chaque acte en scènes(pdv narrateur, séquence, pages, plateaux, etc.). À chaque acte et scène est donc associer une valeur ordre qui désigne sa position dans l’œuvre ou l'acte. Cette valeur ne peux pas être null et il y a une contrainte d'unicité entre l'ordre et l'id de l'objet contenant. J'ai écris le code de trigger qui si la valeur ordre est null elle prendra la première valeur non utilisé, car un auteur peut faire un trou qu'il prévois de remplir plus tard, ou si elle est déjà utilisée toutes les autres seront décalé jusqu'au prochain trou. Le reste étant géré en PHP. Mais le programme ne compile pas et j'ai beau relire, je ne vois pas pourquoi. Ai-je mal écrit est-ce impossible à faire avec un trigger ? Devrais-je utiliser une procédure ou PHP pour cette fonctionnalité ?

    Voici le code :

    -- SELECT `id_acte`, `ordre_a`, `nom`, `typeActe`, `oeuvre_id`, `uriInterne`, `description`, `introA` FROM `actes`

    CREATE TRIGGER before_update_actes BEFORE UPDATE

    ON actes FOR EACH ROW

    BEGIN

        IF NEW.ordre_a IS NULL THEN

            DECLARE v_j INT DEFAULT 1;

            DECLARE v_i CURSOR

                FOR SELECT actes.ordre_a

                FROM actes

                WHERE actes.oeuvre_id = NEW.oeuvre_id

                ORDER BY actes.ordre_a;

            OPEN v_i;


            FETCH v_i INTO ordre_u;

            WHILE ordre_u = v_j

                FETCH v_i INTO ordre_u;

                SET v_j = v_j + 1;

            END WHILE;

            SET NEW.ordre_a = v_j;


            CLOSE v_i;

    ELSEIF OLD.ordre_a != NEW.ordre_a

        DECLARE v_j INT DEFAULT NEW.ordre_a;

            DECLARE v_i CURSOR

                FOR SELECT actes.ordre_a

                FROM actes

                WHERE actes.oeuvre_id = NEW.oeuvre_id AND actes.ordre_a >= NEW.ordre_a

                ORDER BY actes.ordre_a;

            OPEN v_i;

            FETCH v_i INTO ordre_u;

            WHILE ordre_u = v_j

                FETCH v_i INTO ordre_u;

                SET v_j = v_j + 1;

            END WHILE;


            CLOSE v_i;


            WHILE v_j != NEW.ordre_a

                UPDATE actes

                SET actes.ordre_a = v_j

                WHERE actes.oeuvre_id = NEW.oeuvre_id AND actes.ordre_a = (v_j - 1);


                SET v_j = v_j - 1;

            END WHILE;

    END IF;

    END |

    et voici ce que m'affiche la console

    ERROR 1064 (42000): Erreur de syntaxe près de 'DECLARE v_j INT DEFAULT 1;

            DECLARE v_i CURSOR

                FOR SELECT act' à la ligne 5

    -
    Edité par EvaMoulard 1 juin 2020 à 16:17:44

    • Partager sur Facebook
    • Partager sur Twitter

    Trigger qui ne compile pas

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown