【问题标题】:Stored procedure execution in background?存储过程在后台执行?
【发布时间】:2019-05-18 12:20:15
【问题描述】:

如何在后台运行mysql存储过程而不创建加载网站等待过程结果完成?

DELIMITER $$

USE `simbakda_sensus`$$

DROP PROCEDURE IF EXISTS `info`$$

CREATE DEFINER=`potutu`@`%` PROCEDURE `info`(unit VARCHAR(20))
BEGIN   
    DELETE FROM info WHERE kd_unit=unit;
    INSERT INTO info
    SELECT unit,'a' AS kib ,SUM(a) AS a_sen,SUM(b) AS a_tot,(SUM(b)-SUM(a)) AS a_non FROM (
    SELECT unit,COUNT(*) AS a,'0' AS b FROM trkib_a WHERE kd_unit=unit AND STATUS='1'
    UNION ALL
    SELECT unit,'0' AS a, COUNT(*) AS b FROM trkib_a WHERE kd_unit=unit
    )a
    UNION ALL
    SELECT unit,'b' AS kib ,SUM(a) AS a_sen,SUM(b) AS a_tot,(SUM(b)-SUM(a)) AS a_non FROM (
    SELECT unit,COUNT(*) AS a,'0' AS b FROM trkib_b WHERE kd_unit=unit AND STATUS='1'
    UNION ALL
    SELECT unit,'0' AS a, COUNT(*) AS b FROM trkib_b WHERE kd_unit=unit
    )b
    UNION ALL
    SELECT unit,'c' AS kib ,SUM(a) AS a_sen,SUM(b) AS a_tot,(SUM(b)-SUM(a)) AS a_non FROM (
    SELECT unit,COUNT(*) AS a,'0' AS b FROM trkib_c WHERE kd_unit=unit AND STATUS='1'
    UNION ALL
    SELECT unit,'0' AS a, COUNT(*) AS b FROM trkib_c WHERE kd_unit=unit
    )c
    UNION ALL
    SELECT unit,'d' AS kib ,SUM(a) AS a_sen,SUM(b) AS a_tot,(SUM(b)-SUM(a)) AS a_non FROM (
    SELECT unit,COUNT(*) AS a,'0' AS b FROM trkib_d WHERE kd_unit=unit AND STATUS='1'
    UNION ALL
    SELECT unit,'0' AS a, COUNT(*) AS b FROM trkib_d WHERE kd_unit=unit
    )d
    UNION ALL
    SELECT unit,'e' AS kib ,SUM(a) AS a_sen,SUM(b) AS a_tot,(SUM(b)-SUM(a)) AS a_non FROM (
    SELECT unit,COUNT(*) AS a,'0' AS b FROM trkib_e WHERE kd_unit=unit AND STATUS='1'
    UNION ALL
    SELECT unit,'0' AS a, COUNT(*) AS b FROM trkib_e WHERE kd_unit=unit
    )e
    UNION ALL
    SELECT unit,'f' AS kib ,SUM(a) AS a_sen,SUM(b) AS a_tot,(SUM(b)-SUM(a)) AS a_non FROM (
    SELECT unit,COUNT(*) AS a,'0' AS b FROM trkib_f WHERE kd_unit=unit AND STATUS='1'
    UNION ALL
    SELECT unit,'0' AS a, COUNT(*) AS b FROM trkib_f WHERE kd_unit=unit
    )f;
END$$

DELIMITER ;

【问题讨论】:

标签: php mysql stored-procedures mysql-event


【解决方案1】:

你有几个不错的选择。

如果您需要定期运行此程序(例如每小时或每周日 03:00 或其他时间),请使用 MySQL Event。 (请注意,其中一些每月 5 美元的共享托管服务不允许在其 MySQL 服务器上进行事件。)

启用事件调度器:

SET GLOBAL event_scheduler = ON;

然后创建事件对象。它将存在于您的 MySQL 数据库中,并按照您给它的时间表运行。

CREATE EVENT myevent_01
ON SCHEDULE EVERY 1 HOUR
STARTS CURRENT_TIMESTAMP
DO CALL simbakda_sensus.info;

另一种选择是一次性事件。同样的交易,但它运行一次并消失。每次要运行过程时都必须重新创建事件。这是您的程序的纯“后台”执行。

CREATE EVENT run_info_now
ON SCHEDULE AT CURRENT_TIMESTAMP
DO CALL simbakda_sensus.info;

第三种方式:

创建一个运行您的程序的小型 php 页面。然后在您的主网页中放置一个 iframe,并从中调用小页面。您可以让小页面显示“信息完成!”或您的 sp 完成运行时的其他消息。

第四种方式。

一些 linux / FreeBSD / Unix 服务器允许用户设置定期安排的事件,称为 cron 作业。大话题:在这里阅读。 How to create cron job using PHP?

专业提示:创建日志表。使每个数据维护过程在运行时在表中插入一行,显示当前时间和有关过程的其他信息。我向您保证,如果您的系统得到大量使用,您将不时查看此日志以确保一切正常运行。

【讨论】:

  • EXEC 命令是否有任何来源?对于 MySQL,我从未见过这种情况。我会删除我的答案,因为您的答案更全面。但不确定EXEC
  • 是的,@PaulSpiegel,谢谢!这是CALL。我在大脑上恳求 SQL Server。
  • 感谢您关于如何安排一次性活动的说明,这正是我所需要的,但在任何地方都找不到!
猜你喜欢
  • 1970-01-01
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
  • 2013-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-20
相关资源
最近更新 更多