mysql 使用遊標進行刪除操作的預存程序,mysql遊標

來源:互聯網
上載者:User

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

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.