mysql 使用游标进行删除操作的存储过程

来源:互联网 发布:mac下画流程图的工具 编辑:程序博客网 时间:2024/04/29 16:37

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万-百万条数据量删除非常慢,有什么解决方法没有?

0 0
原创粉丝点击