网站建设知识
mysql使用游标进行删除操作的存储过程
2025-07-22 09:53  点击:0
BEGINDECLARE hprocessInstanceId bigint DEFAULT 0; -- 历史流程实例idDECLARE hprocessInstanceIdStarttime CHAR default ''; -- 历史流程实例启动时间DECLARE hprocessInstanceIdEndtime CHAR default ''; -- 历史流程实例结束时间DECLARE hactinstId BIGINT default 0; -- 历史活动实例idDECLARE htaskId BIGINT default 0; -- 历史人工任务idDECLARE hvarId BIGINT default 0; -- 历史流程变量idDECLARE rexecutionId bigint default 0; -- 正在执行流程实例idDECLARE rvarId bigint default 0; -- 正在执行流程变量idDECLARE rtaskId bigint default 0; -- 正在执行人工任务idDECLARE 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;DECLARE rvarRS CURSOR FOR SELECT dbid_ FROM jbpm4_variable where EXECUTION_=hprocessInstanceId;DECLARE rtaskRS CURSOR FOR SELECT dbid_ FROM jbpm4_task where DBID_=rtaskId;DECLARE rswinmlanceRS CURSOR FOR SELECT dbid_ FROM jbpm4_swimlane where dbid_=rswinmlanceId;DECLARE ConTINUE HANDLER FOR SQLSTATE '02000' SET doneFlag = 1;OPEN hprocessInstanceRS;FETCH hprocessInstanceRS INTO hprocessInstanceId,hprocessInstanceIdStarttime,hprocessInstanceIdEndtime;-- 获取历史流程实例表的数据数据REPEATIF hprocessInstanceIdEndtime='' THEN-- 没有结束,执行删除正在执行的流程实例表SET rexecutionId=hprocessInstanceId; -- 未完成的流程实例与正在执行的流程实例id做对应OPEN rexecutionRS;FETCH rexecutionRS INTO rexecutionId;REPEATOPEN hvarRS;FETCH hvarRS INTO rvarId;REPEATdelete from jbpm4_task where dbid_=rvarId;delete from jbpm4_variable where dbid_=rvarId; -- 单条删除流程变量记录FETCH hvarRS INTO rvarId;UNTIL doneFlag END REPEAT;CLOSE hvarRS;delete from jbpm4_execution where dbid_=rexecutionId; -- 单条删除流程对象记录FETCH rexecutionRS INTO rexecutionId;UNTIL doneFlag END REPEAT;CLOSE rexecutionRS;END IF;OPEN hactinstRS;FETCH hactinstRS INTO hactinstId,htaskId;REPEATOPEN htaskRS;FETCH htaskRS INTO htaskId;REPEATdelete from jbpm4_hist_task where dbid_=htaskId;FETCH htaskRS INTO htaskId;UNTIL doneFlag END REPEAT;CLOSE htaskRS;FETCH hactinstRS INTO hactinstId,htaskId;UNTIL doneFlag END REPEAT;CLOSE hactinstRS;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万-百万条数据量删除非常慢,有什么解决方法没有?