mysql之——存储过程 + 游标 + 事务
下面是自己曾经编写过的mysql数据库存储过程,留作存档,以后用到的时候拿来参考。
其中,涉及到了存储过程、游标(双层循环)、事务。
【说明】:代码中的注释只针对当时业务而言,无须理会。
代码如下:
DELIMITER $$
DROP PROCEDURE IF EXISTS `transferEmailTempData`$$ CREATE PROCEDURE transferEmailTempData(IN jobId VARCHAR())
BEGIN
DECLARE idval VARCHAR() DEFAULT '';
DECLARE taskIdval VARCHAR() DEFAULT '';
DECLARE groupIdval VARCHAR() DEFAULT '';
DECLARE emailval VARCHAR() DEFAULT ''; /*标识正式表是否存在一条相同数据,即:groupId、email相同*/
DECLARE infoId VARCHAR() DEFAULT ''; /*标识事务错误*/
DECLARE err INT DEFAULT ; /*达到一定数量就进行提交,计数器*/
DECLARE counts INT DEFAULT ; /*标识是否回滚过*/
DECLARE isrollback INT DEFAULT ; /*游标遍历时,作为判断是否遍历完全部记录的标记*/
DECLARE done INTEGER DEFAULT ; /*获取临时表该任务的数据*/
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=; /*声明当游标遍历完全部记录后将标志变量置成某个值*/
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET done=; /*开启事务*/
START TRANSACTION; /*打开游标*/
OPEN cur; /*使用LOOP循环遍历*/
out_loop:LOOP /*将每一条结果对应的字段值赋值给变量*/
FETCH cur INTO idval,taskIdval,groupIdval,emailval;
IF done = THEN
LEAVE out_loop;
END IF; /*打开第二个游标*/
OPEN cur2;
SET done = ;
FETCH cur2 INTO infoId; /*如果正式表不存在相同groupId and email记录,添加到正式表*/
IF done = THEN /*插入正式表*/
INSERT INTO `t_email_info` VALUES(idval,emailval,groupIdval,,'',NOW(),'admin',NOW(),'admin'); /*删除临时数据*/
DELETE FROM `t_email_data_temp` WHERE id = idval; /*计数器,每1000条才提交*/
SET counts = counts + ; /*发生异常,回滚*/
IF err= THEN
SET isrollback=;
ROLLBACK;
ELSE
IF counts = THEN
COMMIT;
/*达到1000条提交后,重置计数器*/
SET counts=;
END IF;
END IF;
ELSE
/*已经存在相同记录,则删除该记录*/
IF done= THEN
DELETE FROM `t_email_data_temp` WHERE id = idval;
END IF;
END IF;
FETCH cur2 INTO infoId;
CLOSE cur2; /*控制外部的循环,该步骤不能缺少,否则只循环一次就结束了*/
SET done=; END LOOP out_loop;
CLOSE cur; /*如果没有发生过回滚事件,则更新task状态*/
/*如果回滚过,不更新task状态,下次执行任务的时候,会再次将剩余没有提交的数据进行添加到正式表*/
IF isrollback= THEN
UPDATE `t_email_task` t SET t.`if_finish` = WHERE t.`id`=jobId;
END IF; END$$ DELIMITER ;
mysql之——存储过程 + 游标 + 事务的更多相关文章
- MySQL笔记 存储过程 游标 触发器
第二十三章 使用存储过程 MySQL5 中添加了存储过程的支持. 大多数SQL语句都是针对一个或多个表的单条语句.并非所有的操作都怎么简单.经常会有一个完整的操作需要多条才能完成 存储过程简单来说,就 ...
- mysql的存储过程与事务入门
存储过程是:通过一系列的SQL语句, 根据传入的参数(也可以没有), 通过简单的调用, 完成比单个SQL语句更复杂的功能, 存储在数据库服务器端,只需要编译过一次之后再次使用都不需要再进行编译.主要对 ...
- MySQL 存储过程/游标/事务
将会用到的几个表 mysql> DESC products; +------------+--------------+------+-----+---------+-------------- ...
- 【MySql】存储过程添加事务
存储过程使用SQLException捕获SQL错误,然后处理: 我们可以在MySQL存储过程中捕获SQL错误,然后通过事务判断,回滚(ROLLBACK)还是提交(COMMIT). CREATE PRO ...
- MySql使用存储过程实现事务的提交或者回滚
DELIMITER $$ DROP PROCEDURE IF EXISTS test_sp1 $$ CREATE PROCEDURE test_sp1( ) BEGIN ; ; START TRANS ...
- Mysql:存储过程游标不进循环的原因详解
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客给刚接触存储过程的朋友做个引导作用,目的是解决游标不走循环 很多人发现他的游标,无论是嵌套循环还是单层 ...
- 存储过程/游标/mysql 函数
存储过程和函数(存储在 mysql数据库中的 proc表,所以检查有没有这个表)存储过程是一种存储程序(如正规语言里的子程序一样),mysql支持有两种:存储过程,在其他SQL语句中可以返回值的函数( ...
- mysql 视图 触发器 存储过程 函数事务 索引
mysql 视图 触发器 存储过程 函数事务 索引 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当 ...
- MySQL存储过程之事务管理
原文链接:http://hideto.iteye.com/blog/195275 MySQL存储过程之事务管理 ACID:Atomic.Consistent.Isolated.Durable 存储程序 ...
随机推荐
- iOS开发中图片方向的获取与更改
iOS开发中 再用到照片的时候 或多或少遇到过这样的问题 就是我想用的照片有横着拍的有竖着排的 所以导致我选取图片后的效果也横七竖八的 显示效果不好 比如: 图中红圈选中的图片选取的是横着拍 ...
- Kali安全测试相关书籍
Kali安全测试相关书籍http://www.automationqa.com/forum.php?mod=viewthread&tid=4052&fromuid=2
- percona-toolkit工具检查MySQL复制一致性及修复
利用percona-toolkit工具检查MySQL数据库主从复制数据的一致性,以及修复. 一. pt-table-checksum检查主从库数据的一致性 pt-table-c ...
- Matlab命令eig
在MATLAB中,计算矩阵A的特征值和特征向量的函数是eig(A),常用的调用格式有5种: (1) E=eig(A):求矩阵A的全部特征值,构成向量E. (2) [V,D]=eig(A):求矩阵A的全 ...
- 为Debain &&Centos安装dig
Debain&Ubuntu sudo apt-get install dnsutils Fdeoar&Centos yum install bind-utils
- JVM垃圾回收日志结构分析
我们在我们Server的gc log上经常看到下面的这个日志: 总结一下各个字段表达的是什么意思: Young GC Full GC: top -H -P $PID 动态查看java线程的消耗情况 ...
- easyUI 比较时间大小
// function toDate(str){ // var sd=str.split("-" ...
- 基于ubuntu和windows连接
对于ubuntu和centos安装软件是不一样的 对于ubuntu是 apt-get install +软件名字 但是对于centos是 yum install +软件名字 所以ubunu远程连接 ...
- asp:弹出警告框,并重定向的自定义过程
因为制作的需要写了这样一个简单的函数,重定向可以是指定的页.也可以是前一页! 有两个参数:messtr,警告框的信息;urlstr:转向的网页,为""时,返回到前一页! 程序代码 ...
- Oracle、DB2、SQLSERVER、Mysql、Access分页SQL语句梳理
最近把平时在项目中常用到的数据库分页sql总结了下.大家可以贴出分页更高效的sql语句.sqlserver分页 第一种分页方法 需用到的参数: pageSize 每页显示多少条数据 pageNumbe ...