0

有人可以告诉我这个sp有什么问题吗?逻辑似乎没问题,但是当我重新查看表时,它根本不起作用。

    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 ;

我创建了一个每小时触发一次的事件来调用此过程。该过程应该检查 yearly_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 ;
4

3 回答 3

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语句,是没有效果的。尝试使用月份数创建其他(可能是临时表)并连接两个表以找出没有任何销售的月份。在这种情况下,您将一步获得结果。

于 2012-06-27T14:09:23.243 回答
1

可能是全局事件调度程序处于停止/禁用状态。

要打开事件调度程序,请运行以下任一命令:

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

当事件调度器打开时,事件调度器线程作为守护进程列在输出中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 事件调度器配置

于 2012-06-27T14:55:14.717 回答
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);
于 2012-06-27T14:05:24.230 回答