2012-06-27 39 views
0

有人可以告訴我這個sp有什麼問題。邏輯似乎是好的,但是當我檢查我的表時,它根本不起作用。mysql存儲過程沒有從事件調度器中觸發

DELIMITER // 
DROP PROCEDURE IF EXISTS add_zero_yearly_sales_proc // 
CREATE PROCEDURE add_zero_yearly_sales_proc() 
READS SQL DATA 
BEGIN 

DECLARE num_of_sales INT DEFAULT 0; 
DECLARE last_ins_date DATETIME; 
DECLARE done INT DEFAULT 0; 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 

SET last_ins_date = DATE_SUB(NOW(), INTERVAL 2 YEAR); 

ins_loop: WHILE last_ins_date < NOW() DO 
SELECT COUNT(sales_amount_sold) INTO num_of_sales 
FROM yearly_sales 
WHERE sales_date_sold BETWEEN DATE_FORMAT(last_ins_date,'%Y-%m-01 00:00:01') AND DATE_FORMAT(LAST_DAY(last_ins_date),'%Y-%m-%d 23:59:59'); 

IF num_of_sales = 0 THEN 

INSERT INTO yearly_sales(sales_date_sold, sales_amount_sold,sales_quantity) 
VALUES (CONCAT(DATE_FORMAT(last_ins_date,'%Y-%m-01 00:00:01')),0, 0); 

END IF ; 

SET num_of_sales = 0; 
SET last_ins_date = DATE_ADD(last_ins_date, INTERVAL 1 MONTH); 

END WHILE ins_loop; 
SET done = 0; 

END ;// 
DELIMITER ; 

我創建了一個事件,每小時觸發一次該過程。該過程應檢查是否在monthly_sales表中有幾個月沒有任何銷售值,如果是,則爲數量&數量添加0值,併爲該日期添加月份的開始日期。我已經檢查過,但它似乎沒有工作。

而且,這裏是我創建調用它每小時

DELIMITER // 
CREATE  
EVENT `hourly_sales_evt` 
ON SCHEDULE EVERY 1 HOUR STARTS DATE_FORMAT(NOW(),'%Y-%m-%d %H:55:00') 
ON COMPLETION PRESERVE 
DO BEGIN 
    CALL add_zero_yearly_sales_proc(); 
END // 
DELIMITER ; 
+0

的代碼應該直到它到達當月 – goonerify

+0

您是否嘗試過手動調用過程每個月回去2年搜索?它做它應該做什麼?也就是說,您是否遇到了事件調度程序或程序本身的問題? – eggyal

+0

哦,我的!它在我手動調用它時起作用。看來這是不是拍攝的事件。謝謝 – goonerify

回答

1

可能是全局事件調度程序處於停止/禁用狀態。

要打開事件調度器,運行以下任何一種:

SET GLOBAL event_scheduler = ON; 
SET @@global.event_scheduler = ON; 
SET GLOBAL event_scheduler = 1; 
SET @@global.event_scheduler = 1; 

當事件調度爲ON時,事件調度器線程中的SHOW PROCESSLIST輸出作爲守護進程中列出的,其狀態是代表如下所示:

mysql> SHOW PROCESSLIST\G 
*************************** 1. row *************************** 
    Id: 1 
    User: root 
    Host: localhost 
    db: NULL 
Command: Query 
    Time: 0 
    State: NULL 
    Info: show processlist 
*************************** 2. row *************************** 
    Id: 2 
    User: event_scheduler 
    Host: localhost 
    db: NULL 
Command: Daemon 
    Time: 3 
    State: Waiting for next activation 
    Info: NULL 
2 rows in set (0.00 sec) 

一旦事件計劃設置爲ON時,你會看到它的工作。

參考MySQL Event Scheduler Configuration

0

我在這裏採取的猜測沒有做太多的挖掘活動,但我覺得這是你的問題:

READS SQL DATA 
... 
INSERT INTO yearly_sales(sales_date_sold, sales_amount_sold,sales_quantity) 
VALUES (CONCAT(DATE_FORMAT(last_ins_date,'%Y-%m-01 00:00:01')),0, 0); 
1

程序看起來不錯,邏輯應該工作。但是,我想問你 - 爲什麼你從第一秒鐘檢查sales_date_sold - DATE_FORMAT(last_ins_date,'%Y-%m-01 00:00:01'),不應該是DATE_FORMAT(last_ins_date,'%Y-%m-01 00:00:00')?

另一點:你在循環中多次執行SELECT語句,這是無效的。嘗試使用月份數字創建額外的(也許是臨時表格),並加入兩張表格以查找沒有任何銷售額的月份。在這種情況下,您將一步完成結果。

+0

感謝您的時間更新。儘管多次執行select語句,但我認爲它不會以任何方式影響性能,因爲它是作爲事件從背景中解僱的。 – goonerify

+0

因爲您的條件是'2010-06-01 00:00:01',您將跳過像'sales_date_sold'這樣的值 - '2010-06-01 00:00:00'的記錄。 – Devart

相關問題