程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> mysql使用游標進行刪除操作的存儲過程

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

編輯:MySQL綜合教程

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


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萬-百萬條數據量刪除非常慢,有什麼解決方法沒有?

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved