qqluciferzy 2023-03-03 23:22 采纳率: 50%
浏览 68
已结题

请教一个自动更新的MYSQL存储过程

请教写一个mysql存储过程

一个程序在客户端执行数据库更新的时候 总有概率出现更新库失败的情况(通过客户端日志可以证实用户完成了操作,但后台库的记录却没有更新)。

想写一个补救措施的存储过程
是一个报警处理的系统,
实现如下需求
每天晚上执行,自动查询当天的状态没有处理的报警事件,依次查询这些记录的中相同位置的最新一条记录的处理人(字段),查询这些记录的入库时间(字段),
对这些记录依次进行更新
状态(字段)更新为已处理 处理人(字段)更新为查询到相同位置的最后一个处理人(一个班固定一个人负责某几个报警点),处理时间(字段)更新为入库时间+20秒

img

  • 写回答

8条回答 默认 最新

  • Treabhar 2023-03-04 00:00
    关注

    基于GPT的解答
    下面是一个示例MySQL存储过程,实现了您描述的需求。请注意,这只是一个示例,您需要根据实际情况进行适当修改和测试。

    DELIMITER //
    
    CREATE PROCEDURE `update_alerts` ()
    BEGIN
        DECLARE done INT DEFAULT FALSE;
        DECLARE alert_id INT;
        DECLARE alert_location VARCHAR(255);
        DECLARE alert_handler VARCHAR(255);
        DECLARE alert_time DATETIME;
        DECLARE last_handler VARCHAR(255);
        DECLARE last_time DATETIME;
        
        DECLARE cur CURSOR FOR
            SELECT id, location, handler, time
            FROM alerts
            WHERE DATE(time) = CURDATE() AND status = 'unhandled'
            ORDER BY location;
        
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
        
        OPEN cur;
        
        read_loop: LOOP
            FETCH cur INTO alert_id, alert_location, alert_handler, alert_time;
            IF done THEN
                LEAVE read_loop;
            END IF;
            
            SELECT handler, time INTO last_handler, last_time
            FROM alerts
            WHERE location = alert_location AND handler IS NOT NULL
            ORDER BY time DESC
            LIMIT 1;
            
            IF last_handler IS NOT NULL THEN
                SET alert_handler = last_handler;
                SET alert_time = last_time + INTERVAL 20 SECOND;
            END IF;
            
            UPDATE alerts
            SET handler = alert_handler, time = alert_time, status = 'handled'
            WHERE id = alert_id;
        END LOOP;
        
        CLOSE cur;
        
    END //
    
    DELIMITER ;
    

    存储过程的执行步骤如下:

    1.声明变量和游标,用于存储查询结果和循环遍历结果。

    2.定义游标,查询所有当天未处理的报警记录,并按位置排序。

    3.定义异常处理程序,用于判断游标是否已经读取完毕。

    4.打开游标。

    5.读取游标中的每条记录,并获取相同位置的最后一条记录的处理人和入库时间。

    6.如果存在最后一条记录,则将当前记录的处理人和时间更新为最后一条记录的处理人和时间加上20秒。

    7.更新当前记录的状态、处理人和时间。
    8.继续读取下一条记录,直到游标读取完毕。

    9.关闭游标。
    该存储过程可以使用以下语句调用:CALL update_alerts();
    请注意,该存储过程需要在每天晚上自动执行,可以使用MySQL事件或其他调度程序来定时调用。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(7条)

报告相同问题?

问题事件

  • 系统已结题 3月16日
  • 已采纳回答 3月8日
  • 创建了问题 3月3日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效