mysql的存储过程、游标 、事务实例详解

发布时间 - 2026-01-11 02:36:50    点击率:

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的存储过程、游标 、事务的讲解,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# mysql的存储过程  # mysql的存储过程+游标  # +事务实例详解  # mysql存储过程 游标 循环使用介绍  # MySQL存储过程中游标循环的跳出和继续操作示例  # Mysql存储过程循环内嵌套使用游标示例代码  # mysql存储过程中使用游标的实例  # mysql动态游标学习(mysql存储过程游标)  # mysql存储过程之游标(DECLARE)原理与用法详解  # Mysql存储过程中游标的用法实例  # Mysql 存储过程中使用游标循环读取临时表  # MySql存储过程和游标的使用实例  # 遍历  # 存储过程  # 是否存在  # 如有  # 希望能  # 第二个  # 如果没有  # 不存在  # 后将  # 谢谢大家  # 设置为  # 发生过  # 群组  # 写过  # 就回  # 则更  # 出现错误  # 判断是否  # 疑问请  # 经编 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  电商网站制作价格怎么算,网上拍卖流程以及规则?  EditPlus中的正则表达式实战(5)  JavaScript数据类型有哪些_如何准确判断一个变量的类型  详解jQuery中的事件  Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法  微信小程序 input输入框控件详解及实例(多种示例)  香港服务器部署网站为何提示未备案?  如何在企业微信快速生成手机电脑官网?  微信小程序制作网站有哪些,微信小程序需要做网站吗?  百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧  如何快速完成中国万网建站详细流程?  iOS正则表达式验证手机号、邮箱、身份证号等  高端智能建站公司优选:品牌定制与SEO优化一站式服务  昵图网官方站入口 昵图网素材图库官网入口  IOS倒计时设置UIButton标题title的抖动问题  Laravel怎么在Blade中安全地输出原始HTML内容  Laravel怎么为数据库表字段添加索引以优化查询  Bootstrap整体框架之CSS12栅格系统  如何快速生成凡客建站的专业级图册?  Laravel怎么实现支付功能_Laravel集成支付宝微信支付  Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程  油猴 教程,油猴搜脚本为什么会网页无法显示?  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  成都网站制作公司哪家好,四川省职工服务网是做什么用?  HTML 中如何正确使用模板变量为元素的 name 属性赋值  ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集  Win11关机界面怎么改_Win11自定义关机画面设置【工具】  Laravel定时任务怎么设置_Laravel Crontab调度器配置  如何用已有域名快速搭建网站?  Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】  如何快速搭建高效香港服务器网站?  Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转  Laravel用户密码怎么加密_Laravel Hash门面使用教程  如何用免费手机建站系统零基础打造专业网站?  Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程  html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  如何在万网主机上快速搭建网站?  Laravel如何实现用户密码重置功能?(完整流程代码)  Java解压缩zip - 解压缩多个文件或文件夹实例  Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  如何自定义建站之星网站的导航菜单样式?  Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】  C语言设计一个闪闪的圣诞树  PythonWeb开发入门教程_Flask快速构建Web应用  Python进程池调度策略_任务分发说明【指导】  微信公众帐号开发教程之图文消息全攻略  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南