繁体   English   中英

存储过程在后台执行?

[英]Stored procedure execution in background?

如何在不创建加载网站以等待过程结果完成的情况下后台运行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 ;

您有几个不错的选择。

如果您需要定期运行此程序(例如每小时或每个星期日的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作业。 大话题:在这里阅读。 如何使用PHP创建cron作业?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM