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; /** 聲明正在執行流程變量的游標(只刪除2014年條件下由於各種原因未完成的流程實例所對應的流程變量) */ DECLARE rvarRS CURSOR FOR SELECT dbid_ FROM jbpm4_variable where EXECUTION_=hprocessInstanceId; /** 聲明正在執行的人工任務的游標(只是2014年開始的流程實例所對應的) **/ 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萬-百萬條數據量刪除非常慢,有什麼解決方法沒有?