下面是自己曾经编写过的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. hadoop的相关资料链接

    hadoop的资料整理博客 http://www.itpub.net/thread-1588509-1-1.html

  2. .Net 把网页Html转PDF文件

    .Net 把网页Html转PDF文件 此篇主要利用 wkhtmltopdf  进行转换. 一.控制台直接转换 首先到官网http://wkhtmltopdf.org/下载wkhtmltopdf  ,下 ...

  3. 优雅的使用 PhpStorm 来开发 Laravel 项目

    [目录] Prerequisites plugin installation and configuration 1 Ensure Composer is initialized 2 Install ...

  4. dedecms获取栏目下的频道列表

    可以使用: {dede:channelartlist}标签  使用方法: {dede:channelartlist row='6'} <dl>  <dt><a href= ...

  5. Android 使用BaseAdapter 插入不同类型数据

    在使用过程有时要在listview中插入不同类型的数据,比如说position=0的位置插入,广告,其它列表显示数据的情况. 一定要重写两种方法 @Override public int getIte ...

  6. 忘记root口令的处理方法

    最近在拜读<Unix & Linux 大学教程>这本书,这本书写得不错.关于Unix和Linux比较介绍比较深入根源,内容也比较详细,很值得去拜读.       在书中的附录中有一 ...

  7. PHP实现http与https转化

    http://zyan.cc/post/142/ 最近在写PHP程序时,需要使浏览器在https和http之间转化,上网搜索相关信息,无奈只有最近在写PHP程序时,需要使浏览器在https和http之 ...

  8. 在页面生命周期执行时 Page 对象在 SaveState 阶段都发生了什么事?

    先看下 SaveViewState 的源码: // Answer any state this control or its descendants want to save on freeze. / ...

  9. GridView 自定义表头

    //修改表头 protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e) { switch (e.Row.Ro ...

  10. [MAXscript Tool]TimeSlider v1.3

    一个简单的小工具,方便在MAX里面快速的修改帧速率,像maya一样.具体看视频演示.