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

上一篇:使用Highcharts实现柱状图展示


下一篇:MVC使用Dotnet.HighCharts做图表01,区域图表