【问题标题】:can somebody help me with mysql triggers syntax有人可以帮助我使用 mysql 触发器语法吗
【发布时间】:2015-05-19 09:58:13
【问题描述】:

SQL 查询:文档

DELIMITER //
CREATE TRIGGER `test` AFTER INSERT ON `test_series`
  FOR EACH ROW
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE ids INT;
set ids=1;
DECLARE cur CURSOR FOR SELECT NEW.no_of_exam
  FROM test_series WHERE serise_id = NEW.series_id;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur;
ins_loop:
LOOP FETCH cur INTO ids;
IF done THEN LEAVE ins_loop;
END IF;
INSERT INTO test_details (series_id,test_no) VALUES(new.series_id,);
ids=ids+1 END LOOP;
CLOSE cur;
END;
//

MySQL 说:文档

#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 7 行的“DECLARE cur CURSOR FOR SELECT NEW.no_of_exam FROM test_series WHERE serise_id =”附近使用正确的语法

【问题讨论】:

标签: mysql triggers mysql-error-1064 eventtrigger


【解决方案1】:

您不能随时随地DECLARE。所有DECLARE 语句必须位于BEGIN 块的顶部。

在您的代码中,在一些 DECLARE 语句之间,有一个 set ids=1; 语句。而且它违反了DECLARE 的要求。

请在您的代码中进行以下更改。

BEGIN
    -- all declares should be just below a 'begin'
    DECLARE done INT DEFAULT FALSE;
    DECLARE ids INT;
    DECLARE cur CURSOR 
        FOR SELECT NEW.no_of_exam FROM test_series 
             WHERE serise_id = NEW.series_id;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    -- now start your biz logic after all 'declare' statements.      
    SET ids=1;

    OPEN cur;
        ins_loop: LOOP
            FETCH cur INTO ids;
            IF done THEN
                LEAVE ins_loop;
            END IF;
            INSERT INTO test_details (series_id,test_no) VALUES(new.series_id,);

        SET ids=ids+1;
        END LOOP;
    CLOSE cur;
END;

顺便说一句:您正在将光标读入变量但未使用!为什么?我相信您想在插入语句中将其用作test_no。如果是,则insert 语句需要进行以下更改:

INSERT INTO test_details (series_id,test_no) VALUES(new.series_id, ids);

文档参考

DECLARE Syntax

DECLARE 只允许在 BEGIN ... END 复合语句中 并且必须在它的开头,在任何其他语句之前。

声明必须遵循一定的顺序。游标声明必须 出现在处理程序声明之前。变量和条件 声明必须出现在游标或处理程序声明之前

【讨论】:

  • 因为我需要循环插入语句的次数与 cur 中获取的值一样多。
  • 好的...您是否测试了建议的更改??你得到了想要的结果??
  • 是的,我通过一些修改得到了想要的结果,请查看我刚刚更新的我之前的答案,如果有什么问题,请提出建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-03
  • 2021-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多