【问题标题】:Declare variable MySQL trigger声明变量 MySQL 触发器
【发布时间】:2013-04-05 18:57:35
【问题描述】:

如果您习惯使用 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

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

【问题讨论】:

标签: mysql sql stored-procedures triggers


【解决方案1】:

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

【讨论】:

  • 对!这实际上解决了我的问题(在 pgsql 中,你不能在 BEGIN 之前 DECLARE,几乎一样)。这个脚本有另一个错误:Error Code: 1415. Not allowed to return a result set from a trigger。我替换了第一个 SELECT 并解决了它。但是,它仍然不起作用。如果你想帮助我,我已经编辑了我的帖子。
  • 尝试将SELECT @m_user_team_id 替换为SET @m_user_team_id :=。我已经更新了我的帖子。
  • 只是一个注释:“BEGIN DECLARE m_user_team_id integer;” -> 记住在代码之上使用 DECLARE
  • 谢谢!我的问题是我需要 DELIMITER 逻辑。只是为了告诉你,代码示例可以显示的比初衷要多得多!
【解决方案2】:

同意 neubert 关于 DECLARE 语句,这将修复语法错误。但我建议您避免使用打开游标,它们可能会很慢。

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

INSERT ... SELECT Syntax.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    相关资源
    最近更新 更多