mysql存储过程嵌套循环并分页处理数据

业务背景:公司存证产品升级,随着数据量的增加,存证产品线按业务分表,导致以往的存证关联数据需要做数据同步更新。版本发布前,通过当前存储过程解决数据升级问题。

##创建存证文档关联情况下更新所用存储过程

CREATE PROCEDURE evi_doc_refs_eid_deal()
begin
    declare pageNum int default 0;
    declare totalSize int default 0;
    declare pageSize int default 5;
    declare totalPage int DEFAULT 0;
    declare startIndex int default 0;
    select count(*) into totalSize from osv_service_evidence where type != 11 and type !=12 and type !=50  ;
    set totalPage = totalSize/pageSize;
        while ( pageNum<totalPage-1) do
                #对分页的起始下标计算,以便分页查询时使用
                set startIndex = pageNum *pageSize;
                #开启事务
               START TRANSACTION;
                #嵌套内部分页查询,通过游标处理分页查询结果记录
                begin
               #声明变量
                   declare eviId varchar(50);
                   declare evidenceEid varchar(50);
                   declare done int default 0;
                   declare mark varchar(2);
                   declare eid_value varchar(50);
                   declare type_value int default 0;
                   declare eid_mark varchar(50);
                declare num int DEFAULT 0;
                #定义分页查询结果的游标
                   declare i_cur cursor for select id from osv_service_evidence where type !=11 and type !=12 and type !=50 limit startIndex,pageSize;
                   declare continue handler for sqlstate ‘09000‘ set done = 1;

                   open i_cur;
                       fetch next from i_cur into eviId;

                       WHILE (done = 0 ) do
                          #判断每页中处理数据的下标index
                          set num = num+1;
                          select type into type_value  from osv_service_evidence where id = eviId;
                          select e.eid into eid_value from osv_service_evidence e where id = eviId;

                          if(0 =type_value|null = eid_value) then fetch next from i_cur into eviId;
                          end if;

                        #数据处理
                            if     type_value =40 then set mark = ‘O‘; set eid_mark=concat(mark,eid_value);update evi_doc_refs set docEid = eid_mark where docEviId = eviId;
                            elseif type_value =11 then set mark = ‘S‘; set eid_mark=concat(mark,eid_value);update evi_doc_refs set docEid = eid_mark where docEviId = eviId;set done = 0;
                            end if;

                       #如果当前页处理的数据已达页记录数值,通过done退出内部循环,进入外部循环
                        IF num = pageSize THEN set done = 1;
                        #否则继续当前循环
                       ELSEIF num !=pageSize THEN set done =0;
                            fetch next from i_cur into eviId;
                        END IF;
                       END WHILE;
                #关闭游标
                   close i_cur;
                end ;
        COMMIT;
      #更新下一次处理的页码,+1
        set pageNum = pageNum+1;
    end while;
END;

call evi_doc_refs_eid_deal();
##创建出证订单表中存证编号为null的情况下更新所用存储过程
create procedure evi_order_refs_eid_deal()
begin
declare original_eviId varchar(50);
declare evidenceEid varchar(50);
declare done int default 0;
declare mark varchar(2);
declare eid_value varchar(50);
declare type_value int default 0;
declare eid_mark varchar(50);
# declare existence boolean ;
##
declare cur cursor for select eviId  from evi_order_refs where evidenceEid is null order by createTime desc;
##异常处理(触发sql语句失败,执行结束)
declare continue handler for sqlstate ‘09000‘ set done = 1;
open cur;
    ##取出游标值至变量中
    fetch next from cur into original_eviId;
  repeat
    if not done then 

                    select type into type_value  from osv_service_evidence where id = original_eviId;
                    #逻辑判断,如果eviId确实在存证表中无记录,直接忽略该条出证记录

                    select e.eid into eid_value from osv_service_evidence e where id = original_eviId;
                    #逻辑判断,如果eviId确实在存证表中无记录,直接忽略该条出证记录
                    if(0 =type_value|null = eid_value) then fetch next from cur into original_eviId;
                    end if;

                    if     type_value =40 then set mark = ‘O‘;set eid_mark=concat(mark,eid_value);update evi_order_refs set evidenceEid = eid_mark where eviId = original_eviId;
                    elseif type_value =11 then set mark = ‘S‘;set eid_mark=concat(mark,eid_value);update evi_order_refs set evidenceEid = eid_mark where eviId = original_eviId;else  set done = 0;
            end if;
          end if;
        #if(done = 1) then leave cur;

        ##重新抓取数据进入循环
    fetch next from cur into original_eviId;
##结束循环
until done end repeat;
##关闭游标
close cur;
end ;
时间: 2024-10-20 04:30:43

mysql存储过程嵌套循环并分页处理数据的相关文章

Mysql存储过程 一次插入一批数据 或成千条数据 mysql循环语句

Mysql使用存储过程,插入一批数据,可以插入上千条数据,只要使用循环语句,就行了. Mysql(5.0以上版本)在SQLyog(版本是8.32)里如何建立存储过程: 1,          打开SQLyog工具. 2,          建立表procedurehuihui. CREATE TABLE `procedurehuihui` ( `id` BIGINT(20) NOT NULL AUTO_INCREMENT, `code` VARCHAR(50) DEFAULT NULL, `na

MySQL 存储过程中分页

2014-11-20 MySQL数据库中,自定义存储过程查询表中的数据,带有分页功能.具体实例如下代码: 1 DROP PROCEDURE IF EXISTS `sampledb`.`proc_GetPagedDataSet`; 2 3 CREATE DEFINER=`root`@`%` PROCEDURE `proc_GetPagedDataSet`( 4 IN tableName VARCHAR (20), /*表名 5 IN pageIndex INT, /*当前页*/ 6 IN page

一个高效的数据分页的存储过程 可以轻松应付百万数据

一个高效的数据分页的存储过程 可以轻松应付百万数据 CREATE PROCEDURE pageTest --用于翻页的测试--需要把排序字段放在第一列 (@FirstID nvarchar(20)=null, --当前页面里的第一条记录的排序字段的值@LastID nvarchar(20)=null, --当前页面里的最后一条记录的排序字段的值@isNext bit=null, --true 1 :下一页:false 0:上一页@allCount int output, --返回总记录数@pag

mysql存储过程之游标遍历数据表

原文:mysql存储过程之游标遍历数据表 今天写一个mysql存储过程,根据自己的需求要遍历一个数据表,因为对存储过程用的不多,语法不甚熟悉,加之存储过程没有调试环境,花了不少时间才慢慢弄好,故留个痕迹. 1 BEGIN 2 DECLARE Done INT DEFAULT 0; 3 4 DECLARE CurrentLingQi INT; 5 6 DECLARE ShizuName VARCHAR(30); 7 /* 声明游标 */ 8 DECLARE rs CURSOR FOR SELECT

Mysql存储过程包含事务,且传入sql数据执行

有一个需求是:在一个图片按钮上点击,在按钮的上方弹出一个弹框,根据弹框的内容页面做不同的显示.这个其实没什么难的,主要是要控制好弹框的显示位置,让弹框显示在图片的正上方的中间. 一开始是用的Popupwindow,但是Popupwindow不能给弹窗之外的页面加一个半透明的蒙层,当然可以在页面上加一个专门的作为蒙层的View,但是很显然,这么做会代码变得很恶心,于是又换成了Dialog,因为Dialog弹出的时候会自动加一个蒙层的,但是这个时候,弹框显示位置的Y坐标不对了,后来一顿查,原来Dia

jQuery+Ajax+PHP+Mysql实现分页显示数据

css <style type="text/css"> #loading{ position: absolute; top: 200px; left:400px; } #container .pagination ul li.inactive, #container .pagination ul li.inactive:hover{ background-color:#ededed; color:#bababa; border:1px solid #bababa; curs

性能测试四十:Mysql存储过程造数据

性能测试是基于大量数据的,而进行性能测试之前肯定没那么多数据,所以就要自己准备数据 数据构造方法: 1.业务接口 -- 适合数据表关系复杂 -- 优点:数据完整性比较好2.存储过程 -- 适合表数量少,简单 -- 优点:速度最快3.脚本导入 -- 适合数据逻辑复杂 -- 自由度比较高4.数据量级 --测试数据 --基础数据 启动并用工具连接mysql,这里的新建函数,所建的函数,即为存储过程 也可以在命令行mysql -u root -p 登录后输入存储过程的sql运行,但是这就是纯命令行了 执

Mysql 存储过程 处理批量插入具有一定特点的数据

本博文属于原创,转载请注明出处~! 首先,根据业务需求,需要往现有的所有第二级别的知识点中,添加数据 所有第二级别的数据如下: 上图中,cateCode就是代表级别代表,parentID实现链表树状级别 所有的第三第四级别的数据都是一样,其中sort是和当前id一致的,而parentID需要根据逻辑公式求出,下边是第三第四级别的插入sql数据 INSERT INTO `lc_knowledge_type` ( `createTime`, `modifyTime`, `child`, `image

Mysql存储过程包括事务,且传入sql数据运行

有这样一个需求.要求在mysql存储过程中使用到事务,并且运行的是动态的sql语句 代码例如以下: BEGIN DECLARE in_data TEXT; /** 标记是否出错 */ DECLARE errno INT DEFAULT '0'; /** 假设出现sql异常.则将t_error设置为1后继续运行后面的操作 */ DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK;SET errno = 1; END; START TRA