본문 바로가기
MySql

MySQL 변수 MySQL 트리거 선언

by 베이스 공부 2021. 1. 6.
반응형

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 에 오류가 발생합니다. 위의 두 줄에 동일한 지침이 있기 때문에 정말 이해가되지 않습니다.

힌트가 있습니까?

편집 : neubert가이 오류를 해결했습니다. 감사.

그러나 사용자에게 삽입하려고 할 때 :

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

당신은 어떤 생각이 있습니까? 아니면 더 나은 오류 메시지를 얻을 수있는 방법을 알고 있습니까?

 

해결 방법

 

모든 선언은 맨 위에 있어야합니다. 즉.

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

 

참조 페이지 https://stackoverflow.com/questions/15841455

 

 

반응형

댓글