it-roy-ru.com

Объявить переменную MySQL триггер

Мой вопрос может быть простым для вас, если вы привыкли к MySQL. Я привык к PostgreSQL SGBD и пытаюсь перевести скрипт PL/PgSQL в MySQL.

Вот что у меня есть:

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//

Но MySQL Workbench выдает мне ошибку на DECLARE m_projects_id. Я не очень понимаю, потому что у меня та же инструкция на две строки выше ...

Есть намеки?

Правка: Нойберт решил эту ошибку. Благодарю. 

Но все же, когда я пытаюсь вставить в пользователей: 

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

Есть ли у вас какие-либо идеи ? Или лучше, вы знаете, как я могу получить лучшее сообщение об ошибке?

12
Arthur

Все ЗАЯВЛЕНИЯ должны быть наверху. то есть.

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

Согласитесь с neubert относительно операторов DECLARE, это исправит синтаксическую ошибку. Но я бы посоветовал вам не использовать открывающие курсоры, они могут быть медленными.

Для вашей задачи: используйте оператор INSERT ... SELECT, который поможет вам копировать данные из одной таблицы в другую, используя только один запрос.

ВСТАВИТЬ ... ВЫБРАТЬ Синтаксис .

1
amk