web-dev-qa-db-fra.com

Déclare variable déclencheur MySQL

Ma question pourrait être simple pour vous, si vous êtes habitué à MySQL. Je suis habitué à SGBD PostgreSQL et j'essaie de traduire un script PL/PgSQL en MySQL.

Voici ce que j'ai

delimiter //

CREATE TRIGGER pgl_new_user 
AFTER INSERT ON users FOR EACH ROW
BEGIN
    DECLARE m_user_team_id integer;
    SELECT id INTO m_user_team_id FROM user_teams WHERE name = "pgl_reporters";

    DECLARE m_projects_id integer;
    DECLARE cur CURSOR FOR SELECT project_id FROM user_team_project_relationships WHERE user_team_id = m_user_team_id;

    OPEN cur;
        ins_loop: LOOP
            FETCH cur INTO m_projects_id;
            IF done THEN
                LEAVE ins_loop;
            END IF;
            INSERT INTO users_projects (user_id, project_id, created_at, updated_at, project_access) 
            VALUES (NEW.id, m_projects_id, now(), now(), 20);
        END LOOP;
    CLOSE cur;
END//

Mais MySQL Workbench me donne une erreur sur DECLARE m_projects_id. Je ne comprends pas vraiment parce que j'ai la même instruction deux lignes plus haut ...

Des allusions?

EDIT: neubert a résolu cette erreur. Merci. 

Mais quand même, quand j'essaie d'insérer dans les utilisateurs: 

Error Code: 1329. No data - zero rows fetched, selected, or processed

Avez-vous une idée ? Ou mieux, savez-vous comment je peux obtenir un meilleur message d'erreur?

12
Arthur

Tous les DECLARE doivent être au sommet. c'est à dire.

delimiter //

CREATE TRIGGER pgl_new_user 
AFTER INSERT ON users FOR EACH ROW
BEGIN
    DECLARE m_user_team_id integer;
    DECLARE m_projects_id integer;
    DECLARE cur CURSOR FOR SELECT project_id FROM user_team_project_relationships WHERE user_team_id = m_user_team_id;

    SET @m_user_team_id := (SELECT id FROM user_teams WHERE name = "pgl_reporters");

    OPEN cur;
        ins_loop: LOOP
            FETCH cur INTO m_projects_id;
            IF done THEN
                LEAVE ins_loop;
            END IF;
            INSERT INTO users_projects (user_id, project_id, created_at, updated_at, project_access) 
            VALUES (NEW.id, m_projects_id, now(), now(), 20);
        END LOOP;
    CLOSE cur;
END//
23
neubert

En accord avec neubert sur les instructions DECLARE, cela corrigera l’erreur de syntaxe. Mais je vous suggère d'éviter d'utiliser des curseurs d'ouverture, ils peuvent être lents.

Pour votre tâche: utilisez l'instruction INSERT ... SELECT qui vous aidera à copier des données d'une table à une autre à l'aide d'une seule requête.

INSERT ... SELECT Syntax .

1
amk