我想在某个时间调用程序,所以我会为我设置一个事件(调用程序)。代码如下所示:
CALL MainProcedure(@firstOutParam, @secondOutParam);
SELECT @moveId, @endTime; #select just for check if parameters are ok
CREATE EVENT myevent1 ON SCHEDULE AT @endTime DO CALL
`database`.`SupportingProcedure`(@firstOutParam);
CREATE EVENT myevent2 ON SCHEDULE AT @endTime DO CALL `database`.`OnlyForTestProcedure`();
SupportingProcedure
和OnlyForTestProcedure
在调用时并非正常工作,myevent2也会调用。OnlyForTestProcedure
。
唯一不起作用的是myevent1。它出现在show events
上,然后消失但不起作用(SupportingProcedure
未被调用或无法工作..)。
你看到我做错了吗?我该怎么做才能让它发挥作用? 任何帮助表示赞赏,我不知道还有什么要检查。
答案 0 :(得分:1)
您是否启用了事件计划程序?
您需要my.cnf
部分[mysqld]
下的条目:
event_scheduler=on
如果事件以某种方式失败,mysql对诊断它的支持很差,但你会在mysql日志文件中看到一些日志条目(通常位于mysql数据目录中,例如/ var / lib / mysql或者系统记录/ var / log)
文档说明没有办法将参数传递给事件调用的过程,因此传递给@firstOutParam
的第一个事件可能不起作用。为了解决这个问题,你必须动态地构建SQL作为文本并执行它。
SET @sql = CONCAT("CREATE EVENT myevent1 ON SCHEDULE AT ", @endTime, " DO CALL
`database`.`SupportingProcedure`(",@firstOutParam,")");
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
答案 1 :(得分:0)
正如我前面提到的CREATE EVENT
在程序中是不可能的,它可能会关闭主题,但请继续阅读。
1)如果您使用MySQL与PHP并且需要在数据库中使用单个事件,您可以通过mysqli查询方法即时连接。
2)如果你需要跟踪表中的某些变化,你可以创建一个某种守护进程的事件。只需将其设置为:
CREATE EVENT EventDaemon
ON SCHEDULE EVERY 1 SECOND STARTS NOW() DO
CALL procedure();
其中procedure
仅在特定要求发生时执行其正文(这将使您在原始情况下创建事件)。无法确定它是否有效,但对我来说效果很好。
我希望自己清楚明白。