2013-04-05 363 views
10

我的问题对你来说可能很简单,如果你习惯了MySQL。我习惯于PostgreSQL SGBD,我正在尝试将PL/PgSQL脚本翻译成MySQL。声明变量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工作台给我一个错误的DECLARE m_projects_id。我不太明白,因为我的指令同上面两行......

任何提示?

编辑:neubert解决了这个错误。谢谢。

不过不失,当我尝试插入到用户:

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

你有什么想法?或者更好的,你知道我怎么能得到一个更好的错误信息?

+1

看看这里:http://dba.stackexchange.com/questions/25405/event-scheduler-no-data-zero-rows-fetched-selected-or-processed – 2013-04-22 06:05:24

回答

16

所有DECLARE都需要位于顶部。即。

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

对!这实际上解决了我的问题(在pgsql中,你不能在'BEGIN'之前'DECLARE',几乎一样)。我在这个脚本中发生了另一个错误:'错误代码:1415.不允许从触发器返回结果集。我替换了第一个'SELECT',我解决了它。但是,它仍然不起作用。如果你想帮助我,我编辑了我的帖子。 – Arthur 2013-04-05 19:32:27

+1

尝试用'SET @m_user_team_id:='替换'SELECT @ m_user_team_id'。我更新了我的帖子。 – neubert 2013-04-05 20:08:26

+0

只是一个注释:“BEGIN DECLARE m_user_team_id integer;” - >记住在代码上使用DECLARE – 2014-07-02 15:27:00

1

同意neubert关于DECLARE语句,这将解决语法错误。但我建议你避免使用openning游标,它们可能会很慢。

对于您的任务:使用INSERT ... SELECT语句,它将帮助您仅使用一个查询将数据从一个表复制到另一个表。

INSERT ... SELECT Syntax