2013-07-30 40 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