在事件中运行某些过程失败

时间:2011-02-26 15:16:43

标签: mysql events stored-procedures

我想在某个时间调用程序,所以我会为我设置一个事件(调用程序)。代码如下所示:

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`();

SupportingProcedureOnlyForTestProcedure在调用时并非正常工作,myevent2也会调用。OnlyForTestProcedure

唯一不起作用的是myevent1。它出现在show events上,然后消失但不起作用(SupportingProcedure未被调用或无法工作..)。

你看到我做错了吗?我该怎么做才能让它发挥作用? 任何帮助表示赞赏,我不知道还有什么要检查。

2 个答案:

答案 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仅在特定要求发生时执行其正文(这将使您在原始情况下创建事件)。无法确定它是否有效,但对我来说效果很好。

我希望自己清楚明白。