mysql - 检索失败事件的错误

标签 mysql mysql-workbench

我试图找出如果事件失败会发生什么,这是我的事件 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 的一些截图:

Test Test2

更新:尝试更改秒 END来自 END; $$END; ,工作台不会显示任何错误,但也不会运行查询。

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

最佳答案

这是正确的查询:

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

关于mysql - 检索失败事件的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29817467/

相关文章:

php - cakephp 3.x 同时在两个表中插入数据

php - 使用单个查询从表 A 中的值计算表 B 的结果数

MySQL 重新排序列表

mysql - 支持 LIST COLUMNS 分区的 MySQL 最低版本

mysql 日期序列的平均长度

mysql - Django : select all columns when innerjoin using extra without foreignkey

mysql - 任何人都可以告诉我为什么我的查询需要永远运行吗?

c# - 我已经在 MySQL Workbench 中创建了 MySQL 数据库,但无法在 C# 中使用

MySQL WorkBench 医院数据库

MySQL远程访问不可能