2013-07-30 42 views
2

假设如果EVENT内的查询不是OKEVENT会立即失败吗?如果查询在事件中失败,EVENT是否失败?

DELETE是破坏性的,所以我想确保在(相同记录)是DELETEd之前先前的查询成功。

use argus_dnsdb; 
DELIMITER | 
CREATE EVENT `dnsdb_rotator` 
ON SCHEDULE 
EVERY 1 DAY 
STARTS date_format(now(), '%Y-%m-%d 00:00:05') 
ON COMPLETION NOT PRESERVE 
ENABLE 
DO BEGIN 
set @target_table_name=CONCAT('`argus_dnsdb`.`',date_format(date_sub(now(),interval 1 day), '%Y%m%d'),'`'); 
set @create_table_stmt_str = CONCAT('CREATE TABLE ',@target_table_name,' like `argus_dnsdb`.`main`;'); 
PREPARE create_table_stmt FROM @create_table_stmt_str; 
EXECUTE create_table_stmt; 
DEALLOCATE PREPARE create_table_stmt; 
set @a=unix_timestamp(date_format(now(), '%Y-%m-%d 00:00:00')); 
set @insert_stmt_str = CONCAT('INSERT INTO ',@target_table_name,' SELECT * FROM `argus_dnsdb`.`main` WHERE qtime < ',@a,' ;'); 
PREPARE insert_stmt FROM @insert_stmt_str; 
EXECUTE insert_stmt; 
DEALLOCATE PREPARE insert_stmt; 
DELETE FROM `argus_dnsdb`.`main` WHERE qtime < @a ; 
END; 
| 
DELIMITER ; 

在这种情况下,如果EXECUTE insert_stmt;失败,将EVENT停止执行DO块?

回答

1

这取决于错误的类型。 As stated in the manual

如果其中没有处理程序已被宣布发生[出错]条件,采取的 动作取决于条件类:

对于SQLEXCEPTION条件下,所存储的程序终止于 声明提出了条件,好像有一个退出处理程序[即程序返回]。 如果程序被另一个存储的程序调用,则调用 程序使用处理程序选择规则 应用于其自己的处理程序来处理条件。

对于SQLWARNING条件,程序继续执行,就好像 有一个CONTINUE处理程序。

对于NOT FOUND条件,如果条件正常提高,则 操作为CONTINUE。如果它是由SIGNAL或RESIGNAL提出的,则动作 为EXIT。

失败的插入引发了一个SQLEXCEPTION,所以程序终止(或触发自定义错误处理程序,如果这样的处理程序存在)。 (在相同的手册页中提供了SQLEXCEPTIONSQLWARNINGNOT FOUND定义)

+0

完美的感谢! 'DECLAREing'' EXIT HANDLER'来处理特定的'SQLSTATE'将是另一种选择,但在这种情况下是不必要的。由于系统限制,赏金将在3小时内颁发。 – mbrownnyc