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 ;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM