使用局部变量的Mysql事件调度程序

时间:2018-04-01 15:44:31

标签: mysql mysql-workbench

我正在尝试在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>

1 个答案:

答案 0 :(得分:1)

我认为每个事件都在新会话中执行,而用户定义的变量具有会话范围。因此,您无法在事件中真正使用这些变量,并使其价值从一个事件执行到另一个事件继续存在。

这是一个展示它的测试:

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