zoukankan      html  css  js  c++  java
  • 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万-百万条数据量删除很慢。有什么解决方法没有?

  • 相关阅读:
    HDU 2066 一个人的旅行 最短路问题
    HDU 2112 HDU Today 最短路
    HDU 2521 反素数 模拟题
    mac 安装 office
    selenium用法 (python)
    selenium遇到不可编辑input和隐藏input如何赋值
    mac 下bash命令
    ssh 自动登录
    linux常用命令
    json字符串调整
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5239850.html
Copyright © 2011-2022 走看看