我试图在mysql中创建一个报表调度,但是查询依赖于局部变量fdate。如何让mysql加载fdate变量,然后在第二个事件中运行查询?谢谢

CREATE EVENT fdate
  ON SCHEDULE
  EVERY 1 DAY
starts '2018-03-26 07:30:00'
Do
 set @fdate = 2018031; #EOM prior month

create event report_1 on SCHEDULE
   EVERY 1 day
 starts '2018-03-26 07:31:00'
DO
 <Here is the Query depending up fdate>

最佳答案

我认为每个事件都在一个新的会话中执行,并且用户定义的变量具有会话作用域。因此,您不能在事件中真正使用这些变量,并使它们的值从一个事件执行到另一个事件执行。
下面是一个测试:

mysql> create table log ( i int );

mysql> create event e on schedule every 1 minute do
    -> insert into log set i = @a := coalesce(@a+1, 1);

如果@a变量从一个事件执行到下一个事件执行保留其值,我们将在我的log表中获得一系列递增值。
几分钟后,我们发现我们没有得到递增的值。每次执行从1开始计数器。
mysql> select * from log;
+------+
| i    |
+------+
|    1 |
|    1 |
|    1 |
+------+

但您可以DECLARE一个局部变量,并在事件的复合语句体中使用它。
CREATE EVENT fdate
  ON SCHEDULE
  EVERY 1 DAY
  STARTS '2018-03-26 07:30:00'
DO BEGIN
  DECLARE fdate INT;
  SET fdate = DATE_FORMAT(LAST_DAY(CURDATE() - INTERVAL 1 MONTH), '%Y%m%d');
  # following query uses fdate
END

10-04 16:06