下面是自己曾经编写过的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之——存储过程 + 游标 + 事务的更多相关文章

  1. MySQL笔记 存储过程 游标 触发器

    第二十三章 使用存储过程 MySQL5 中添加了存储过程的支持. 大多数SQL语句都是针对一个或多个表的单条语句.并非所有的操作都怎么简单.经常会有一个完整的操作需要多条才能完成 存储过程简单来说,就 ...

  2. mysql的存储过程与事务入门

    存储过程是:通过一系列的SQL语句, 根据传入的参数(也可以没有), 通过简单的调用, 完成比单个SQL语句更复杂的功能, 存储在数据库服务器端,只需要编译过一次之后再次使用都不需要再进行编译.主要对 ...

  3. MySQL 存储过程/游标/事务

    将会用到的几个表 mysql> DESC products; +------------+--------------+------+-----+---------+-------------- ...

  4. 【MySql】存储过程添加事务

    存储过程使用SQLException捕获SQL错误,然后处理: 我们可以在MySQL存储过程中捕获SQL错误,然后通过事务判断,回滚(ROLLBACK)还是提交(COMMIT). CREATE PRO ...

  5. MySql使用存储过程实现事务的提交或者回滚

    DELIMITER $$ DROP PROCEDURE IF EXISTS test_sp1 $$ CREATE PROCEDURE test_sp1( ) BEGIN ; ; START TRANS ...

  6. Mysql:存储过程游标不进循环的原因详解

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客给刚接触存储过程的朋友做个引导作用,目的是解决游标不走循环 很多人发现他的游标,无论是嵌套循环还是单层 ...

  7. 存储过程/游标/mysql 函数

    存储过程和函数(存储在 mysql数据库中的 proc表,所以检查有没有这个表)存储过程是一种存储程序(如正规语言里的子程序一样),mysql支持有两种:存储过程,在其他SQL语句中可以返回值的函数( ...

  8. mysql 视图 触发器 存储过程 函数事务 索引

    mysql 视图 触发器 存储过程 函数事务 索引 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当 ...

  9. MySQL存储过程之事务管理

    原文链接:http://hideto.iteye.com/blog/195275 MySQL存储过程之事务管理 ACID:Atomic.Consistent.Isolated.Durable 存储程序 ...

随机推荐

  1. mfc模态对话框

    Mfc模态对话框: 创建模态对话框: [模态对话框:具有独占行为,必须由用户完成对当前对话框的响应,才能对本对话框所属的进程进行其他操作] 例如: 我们创建一个加法计算器.点击计算之后,弹出一个对话框 ...

  2. 关于Http协议的解析

    HTTP概述 HTTP(hypertext transport protocol),即超文本传输协议.这个协议详细规定了浏览器和万维网服务器之间互相通信的规则. HTTP就是一个通信规则,通信规则规定 ...

  3. nodejs中npm工具自身升级

    npm官方地址:https://www.npmjs.com/ npm在github上的地址:https://github.com/npm/npm 目前(截止2016-03-15)npm最新版本为3.8 ...

  4. 到目前为止,Linux下最完整的Samba服务器配置攻略

    关 于Samba,大家有没有这种感觉,弄了N久丫的死活不喘气儿.找来各种“哥”和“姐”,发现全是“详解…配置专题”,看了半天不知道别个在说什么,好不 容易找了个简单的教程,从头到尾跟着做,尼玛,浪费时 ...

  5. [转载]删除所有的.svn文件夹

    Windows 下,在DOS窗口中运行如下命令 dos 代码 for /r <你项目的路径> %i in (.svn) do rd /s /q %i Linux 下,可以先运行 显示出当前 ...

  6. Unity3D 之连按移动加速

    上代码: 效果是连续按W后,加速移动 为物体添加个拖拽效果,方便看运动轨迹. 将下面的脚本绑定到移动的物体上. 不过这里有一点很重要的需要去注意就是该方法不能放在 void FixedUpdate() ...

  7. OAuth2集成——《跟我学Shiro》

    http://jinnianshilongnian.iteye.com/blog/2038646 目前很多开放平台如新浪微博开放平台都在使用提供开放API接口供开发者使用,随之带来了第三方应用要到开放 ...

  8. UrlOfFIle

    如上,报错位置为folder.Files[],表示这里需要的是文件的Url地址,即folder.Files[文件的Url地址].

  9. Android Activity常用生命周期函数

    在Activity中主要有7个常用的周期函数,他们分别是: (一)onCreate 在Activity对象被第一次创建时调用 注: 从另一个Activity返回到前一个Activity时,不会调用该函 ...

  10. popen pclose 不等待命令执行完毕

    $handle = popen("start D:\\test.bat", "r"); //exec("start D:\\test.bat" ...