mysql 使用游標進行刪除操作的儲存過程

2021-09-08 22:30:07 字數 4288 閱讀 4547

begin

declare  hprocessinstanceid bigint default 0; -- 歷史流程例項id

declare  hprocessinstanceidstarttime char default '';  -- 歷史流程例項啟動時間

declare  hprocessinstanceidendtime char default '';  -- 歷史流程例項結束時間

declare  hactinstid bigint default 0;  -- 歷史活動例項id

declare  htaskid bigint default 0;  -- 歷史人工任務id

declare  hvarid bigint default 0;  -- 歷史流程變數id

declare  rexecutionid bigint  default 0; -- 正在執行流程例項id

declare  rvarid bigint  default 0; -- 正在執行流程變數id

declare  rtaskid bigint  default 0; -- 正在執行人工任務id

declare  rswinmlanceid bigint  default 0; -- 泳道id,為了刪除partation表記錄。本專案無記錄

declare  processcompleteflag int default 0; --  流程是否結束標識

declare  taskcompleteflag int default 0; -- 任務是否結束標識

declare  doneflag int default 0; -- 完畢標識,0:未完畢;1:已完畢

declare  notfound int default 0;-- 是否未找到資料 標記

-- 啟動事物

-- start transaction;   

/* 宣告歷史流程例項的游標 */

declare hprocessinstancers cursor for select dbid_,start_,end_ from jbpm4_hist_procinst  where start_>='2014-0-0 0:0:0' and  start_<'2015-0-0 0:0:0';

/* 宣告歷史活動例項的游標 */

declare hactinstrs cursor for select dbid_,htask_ from jbpm4_hist_actinst  where hproci_=hprocessinstanceid;

/* 宣告歷史活動例項的游標 */

declare htaskrs cursor for select dbid_ from jbpm4_hist_task where dbid_=hactinstid;

/* 宣告歷史活動例項的游標 */

declare hvarrs cursor for select dbid_ from jbpm4_hist_var where htask_=rtaskid;

/** 宣告正在執行流程例項的游標(歷史表中由於各種原因未完畢的) **/

declare rexecutionrs cursor for select dbid_ from jbpm4_execution where dbid_=hprocessinstanceid;

/** 宣告正在執行流程變數的游標(僅僅刪除2023年條件下因為各種原因未完畢的流程例項所相應的流程變數) */

declare rvarrs cursor for select dbid_ from jbpm4_variable where execution_=hprocessinstanceid;

/** 宣告正在執行的人工任務的游標(僅僅是2023年開始的流程例項所相應的) **/

declare rtaskrs cursor for select dbid_ from jbpm4_task where dbid_=rtaskid;

/** 宣告泳道的結果集游標。為了刪除paritation表。該專案沒有記錄,實際刪除條數為0 **/

declare rswinmlancers cursor for select dbid_ from jbpm4_swimlane where dbid_=rswinmlanceid;

/* 異常處理 */

declare continue handler for sqlstate '02000' set doneflag = 1;

/** 刪除s,使用巢狀迴圈..... **/

open hprocessinstancers;

fetch hprocessinstancers into hprocessinstanceid,hprocessinstanceidstarttime,hprocessinstanceidendtime;-- 獲取歷史流程例項表的資料資料

repeat

if hprocessinstanceidendtime='' then

-- 沒有結束,執行刪除正在執行的流程例項表

/** 1.查詢正在執行的流程例項記錄s **/

set rexecutionid=hprocessinstanceid; -- 未完畢的流程例項與正在執行的流程例項id做相應

open rexecutionrs;

fetch rexecutionrs into rexecutionid;

repeat

/** 2.查詢該流程例項下的全部正在執行的流程變數記錄s 2**/

open hvarrs;

fetch hvarrs into rvarid;

repeat

/** 3.刪除正在執行的流程變數所相應的人工任務記錄s 3**/

delete from jbpm4_task where dbid_=rvarid;

/** 3.刪除正在執行的流程變數所相應的人工任務記錄e 3**/

delete from jbpm4_variable where dbid_=rvarid; -- 單條刪除流程變數記錄

fetch hvarrs into rvarid;

until doneflag end repeat;

close hvarrs;

/** 2.查詢該流程例項下的全部正在執行的流程變數記錄e 2**/

delete from jbpm4_execution where dbid_=rexecutionid;  -- 單條刪除流程物件記錄

fetch rexecutionrs into rexecutionid;

until doneflag end repeat;

close rexecutionrs;

end if;

/*** *****=刪除歷史流程記錄表相關資料***** **/

/** 1.查詢活動例項表 s **/

open hactinstrs;

fetch hactinstrs into hactinstid,htaskid;

repeat

/** 2.查詢歷史人工活動表記錄s **/

open htaskrs;

fetch htaskrs into htaskid;

repeat

/** 3.刪除歷史人工任務 **/

delete from jbpm4_hist_task where dbid_=htaskid;

fetch htaskrs into htaskid;

until doneflag end repeat;

close htaskrs;

/** 2.查詢歷史人工活動表記錄s **/

fetch hactinstrs into hactinstid,htaskid;

until doneflag end repeat;

close hactinstrs;

/** 1.查詢活動例項表 e **/

/*** *****=刪除歷史流程記錄表相關資料***** **/

/** 刪除歷史活動例項表 **/

delete from jbpm4_hist_actinst where hproci_=hprocessinstanceid;

set doneflag=0;

fetch hprocessinstancers into hprocessinstanceid,hprocessinstanceidstarttime,hprocessinstanceidendtime;-- 獲取歷史流程例項表的資料資料

until doneflag end repeat;

close hprocessinstancers;

end使用巢狀之後,10萬-百萬條資料量刪除很慢。有什麼解決方法沒有?

mysql 使用游標進行刪除操作的儲存過程

begin declare hprocessinstanceid bigint default 0 歷史流程例項id declare hprocessinstanceidstarttime char default 歷史流程例項啟動時間 declare hprocessinstanceidendti...

MYSQL使用游標

一 使用游標 一 宣告游標。delare cursor name cursor for select statement 解釋 cursor name是游標的名字 select statement表示select語句。因為游標需要遍歷結果集的每一行,增加了伺服器的負擔,導致游標的效率並不高效,如果使...

SQL 使用游標進行遍歷

前兩天乙個同事大叔問了這樣乙個問題,他要對錶做個類似foreach的效果,問我怎麼搞,我想了想,就拿游標回答他,當時其實也沒用過資料庫中的游標,但是以前用過ado裡面的,感覺應該差不多。首先,讓我們先來建張測試表 use loadtest2010 create table testcursor 建立...