共计 2114 个字符,预计需要花费 6 分钟才能阅读完成。
自动写代码机器人,免费开通
这篇文章给大家分享的是有关 mysql 的存储过程、游标、事务有什么用的内容。丸趣 TV 小编觉得挺实用的,因此分享给大家做个参考。一起跟随丸趣 TV 小编过来看看吧。
mysql 的存储过程、游标、事务实例详解
下面是自己曾经编写过的 mysql 数据库存储过程,留作存档,以后用到的时候拿来参考。
其中,涉及到了存储过程、游标(双层循环)、事务。
【说明】:代码中的注释只针对当时业务而言,无须理会。
代码如下:
DELIMITER $$
DROP PROCEDURE IF EXISTS `transferEmailTempData`$$
CREATE PROCEDURE transferEmailTempData(IN jobId VARCHAR(24))
BEGIN
DECLARE idval VARCHAR(24) DEFAULT
DECLARE taskIdval VARCHAR(24) DEFAULT
DECLARE groupIdval VARCHAR(24) DEFAULT
DECLARE emailval VARCHAR(50) DEFAULT
/* 标识正式表是否存在一条相同数据,即:groupId、email 相同 */
DECLARE infoId VARCHAR(24) DEFAULT
/* 标识事务错误 */
DECLARE err INT DEFAULT 0;
/* 达到一定数量就进行提交,计数器 */
DECLARE counts INT DEFAULT 0;
/* 标识是否回滚过 */
DECLARE isrollback INT DEFAULT 0;
/* 游标遍历时,作为判断是否遍历完全部记录的标记 */
DECLARE done INTEGER DEFAULT 0;
/* 获取临时表该任务的数据 */
DECLARE cur CURSOR FOR SELECT id,taskId,groupId,email FROM `t_email_data_temp` WHERE taskId=jobId;
/* 根据群组 id、email 查询是否存在相同记录 */
DECLARE cur2 CURSOR FOR SELECT id FROM `t_email_info` e WHERE e.`group_id` = groupIdval AND e.`email_address` = emailval;
/* 出现错误,设置为 1,只要发生异常就回滚 */
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET err=1;
/* 声明当游标遍历完全部记录后将标志变量置成某个值 */
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET done=1;
/* 开启事务 */
START TRANSACTION;
/* 打开游标 */
OPEN cur;
/* 使用 LOOP 循环遍历 */
out_loop:LOOP
/* 将每一条结果对应的字段值赋值给变量 */
FETCH cur INTO idval,taskIdval,groupIdval,emailval;
IF done = 1 THEN
LEAVE out_loop;
END IF;
/* 打开第二个游标 */
OPEN cur2;
SET done = 0;
FETCH cur2 INTO infoId;
/* 如果正式表不存在相同 groupId and email 记录,添加到正式表 */
IF done = 1 THEN
/* 插入正式表 */
INSERT INTO `t_email_info` VALUES(idval,emailval,groupIdval,0, ,NOW(), admin ,NOW(), admin
/* 删除临时数据 */
DELETE FROM `t_email_data_temp` WHERE id = idval;
/* 计数器,每 1000 条才提交 */
SET counts = counts + 1;
/* 发生异常,回滚 */
IF err=1 THEN
SET isrollback=1;
ROLLBACK;
ELSE
IF counts = 1000 THEN
COMMIT;
/* 达到 1000 条提交后,重置计数器 */
SET counts=0;
END IF;
END IF;
ELSE
/* 已经存在相同记录,则删除该记录 */
IF done=0 THEN
DELETE FROM `t_email_data_temp` WHERE id = idval;
END IF;
END IF;
FETCH cur2 INTO infoId;
CLOSE cur2;
/* 控制外部的循环,该步骤不能缺少,否则只循环一次就结束了 */
SET done=0;
END LOOP out_loop;
CLOSE cur;
/* 如果没有发生过回滚事件,则更新 task 状态 */
/* 如果回滚过,不更新 task 状态,下次执行任务的时候,会再次将剩余没有提交的数据进行添加到正式表 */
IF isrollback=0 THEN
UPDATE `t_email_task` t SET t.`if_finish` = 1 WHERE t.`id`=jobId;
END IF;
END$$
DELIMITER ;
感谢各位的阅读!关于 mysql 的存储过程、游标、事务有什么用就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到吧!
向 AI 问一下细节
丸趣 TV 网 – 提供最优质的资源集合!
正文完