【问题标题】:Retrieving error for failed event检索失败事件的错误
【发布时间】:2015-07-01 06:51:30
【问题描述】:

我试图找出如果事件失败会发生什么,这是我的事件 sql:

DELIMITER $$

CREATE EVENT IF NOT EXISTS `cdr2015_daily_update`
ON SCHEDULE EVERY 1 DAY
    STARTS (TIMESTAMP(CURRENT_DATE) + INTERVAL 1 DAY + INTERVAL 3 HOUR)
DO 
BEGIN
DECLARE EXIT HANDLER FOR MYSQLEXCEPTION, MYSQLWARNING
    BEGIN
    insert into events_state values ('cdr2015_daily_update', 'true', now(), 'unknown', 'unknown')
    END;

    insert into 
        cdr2015_v2 (clid, src, dst, dcontext, channel, dstchannel) 
    select 
        calldate, clid, src, dst, dcontext, channel, dstchannel
        from cdr where DATE_FORMAT(calldate, '%Y-%m-%d') = subdate(current_date, 1); -- yesterday calls 
        
END; $$

DELIMITER ;

每天 03:00 备份前一天的通话。此事件肯定会失败,但我想知道错误,例如:

`Error Code: 1136. Column count doesn't match value count at row 1` , is it possible to catch this error and insert it into another table? 

这是 events_state 表:

CREATE TABLE `events_state` (
`event` varchar(255) DEFAULT NULL,
`failed` varchar(255) DEFAULT NULL,
`fail_date` datetime,
`reason1` varchar(255) DEFAULT NULL,
`reason2` varchar(255) DEFAULT NULL,
`RID` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`RID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1

现在事件正在插入:

insert into events_state values ('cdr2015_daily_update', 'true', now(), 'unknown', 'unknown')

可以改成这样吗?

insert into events_state values ('cdr2015_daily_update', 'true', now(), MYSQLEXCEPTION, MYSQLWARNING) 

此外,由于END; 都出现错误,因此我无法运行此事件,以下是 mysql-workbench 的一些屏幕截图:

更新:尝试将第二个 END 从 END; $$ 更改为 END; ,工作台不会显示任何错误,但也不会运行查询。

更新 2: 将行 insert ... 'unknown') 更改为 insert ... 'unknown'); ,在行尾添加 ;。查询现在运行,但我得到另一个错误:Error Code: 1319. Undefined CONDITION: EXCEPTION

【问题讨论】:

    标签: mysql mysql-workbench


    【解决方案1】:

    这是正确的查询:

    SET GLOBAL event_scheduler = ON;
    
    DELIMITER $$
    
    CREATE EVENT IF NOT EXISTS `cdr2015_daily_update`
    ON SCHEDULE EVERY 1 DAY
        STARTS (TIMESTAMP(CURRENT_DATE) + INTERVAL 1 DAY + INTERVAL 3 HOUR)
    DO 
    BEGIN
        DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
        BEGIN
        insert into events_state values ('cdr2015_daily_update', 'true', now(), 'unknown', 'unknown', 0);
        END;
    
        insert into 
            cdr2015 (calldate, clid, src, dst, dcontext, channel, dstchannel) 
        select 
            calldate, clid, src, dst, dcontext, channel, dstchannel
            from cdr where DATE_FORMAT(calldate, '%Y-%m-%d') = subdate(current_date, 1)
            limit 10;
    
    END; $$
    DELIMITER ;
    

    我的 MySQL 版本是 5.1,因此无法进行错误处理。 “插入”异常中的错误文本只能从 5.6 版开始,参考:

    Getting SQLEXCEPTION message in procedures MySQL 5.5.x

    MySQL Stored Procedure Error Handling

    【讨论】:

      【解决方案2】:

      关于END中的错误,只是

      > Your code
      > ; //this ; is used to close the insert i think
      > END $$
      > DELIMITER ;
      

      (不要放';'),试试吧,现在应该可以了

      【讨论】:

      • 试过 END $$ 也不管用,试过 END;没有 $$ 并且查询不会运行
      • 只放 END $$ 时收到的错误信息是什么?你也把 DELIMITER ;上面那个对吗?,我会尽快编辑我的答案
      • 好的,我认为您在 END 之前缺少一个 semincolor,现在尝试我编辑的答案
      • 我的回答对你有帮助吗?至于你的第二次更新,你想把 Mysqlexception 作为结果还是作为字符串?我的意思是,您可以将 insert 插入 events_state 值('cdr2015_daily_update'、'true'、now()、'MYSQLEXCEPTION'、'MYSQLWARNING'),它会显示为字符串。测试完毕后回复
      • 试了几样,半小时左右就更新了,我继续测试
      猜你喜欢
      • 1970-01-01
      • 2019-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多