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

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-14 08:02:30

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

MySql 中游标,事务,终止存储过程方法总结

最近在项目开发中,有段逻辑处理,需要在网站,app,后台分别运行,这样给后期的维护带来了很大的不方便,容易遗漏app端或者后台,所以讲java代码转换成存储过程,把逻辑处理写在了mysql端,其中遇到游标,事务的处理.问题并不困难,只是容易忘记,做了一下总结: DECLARE err INT DEFAULT 0;#声明一个整形变量err,默认值是0 DECLARE orderDone INT DEFAULT FALSE;-- 遍历游标结束标识 DECLARE cur_order CURSOR F

用python操作mysql数据库(之“删除”操作)

#!/usr/bin/env python # -*- coding: utf-8 -*-   import MySQLdb   #建立连接 conn = MySQLdb.connect(host='127.0.0.1',user='root',passwd='1qaz#EDC',db='test_db') cur = conn.cursor()   #对数据进行操作 sql = "delete from user where id=%s" #定义一条删除指定ID的sql语句 para

Mysql多表关联删除操作

直接看Sql即可: delete tableA a from tableA a left join tableB b on a.netbar_id = b.netbar_id where b.role_id = 0;

总结: MySQL(基础,字段约束,索引,外键,存储过程,事务)操作语法

1. 显示数据库列表 show databases; # 查看当前所有数据库 show databases \G   #以行的方式显示 2. 在命令行中,执行sql语句 mysql -e 'show databases' -uroot -p123456 mysqlshow -uroot -p123456 # 不常用,记住上面那个就行了 3.创建数据库语法 create database 数据库名; 例如: create database `HA-test`; 4. 切换数据库 use HA-te

Entity Framework 6 Recipes 2nd Edition(10-10)译 - &gt; 为TPH继承的插入、更新、删除操作映射到存储过程

10-10. 为TPH继承的插入.更新.删除操作映射到存储过程 问题 TPH继承模型,想把它的插入.修改.删除操作映射到存储过程 Solution 假设数据库有一个描述不同种类的产品表(Product )(见Figure 10-13). 而且为这个表的每种产品创建了创建了派生模型,这个模型如Figure 10-14. Figure 10-13. 一个含有鉴别列(ProductType)的产品表, 表的每行按该列的值划分不同的产品 Figure 10-14. TPH继承形式的模型 接下来把这个模型

mysql中游标在存储过程中的详细用法

昨天写的一个东东,分享下给大家. drop PROCEDURE  if exists sp_cleanUserData; CREATE  PROCEDURE `sp_cleanUserData`() BEGIN /*定义游标*/ declare v_dt bigint(20) default 0 ; declare v_num INT DEFAULT 0; /*游标循环到末尾时给定义的常量赋值*/ declare cur_userId   CURSOR FOR select  userId fr

MySQL数据库表的数据插入、修改、删除操作及实例应用

1.MySQL数据库表的数据插入.修改.删除操作SQL语法格式: 1 CREATE DATABASE db0504; 2 3 USE db0504; 4 5 CREATE TABLE student ( 6 sno VARCHAR (10) NOT NULL UNIQUE PRIMARY KEY, 7 sname VARCHAR (20) NOT NULL, 8 ssex enum ('男', '女') NOT NULL DEFAULT '男', 9 sbirth date, 10 sclass

MySQL数据库基础(六)——SQL插入、更新、删除操作

MySQL数据库基础(六)--SQL插入.更新.删除操作 一.插入数据 1.为表的所有字段插入数据 使用基本的INSERT语句插入数据要求指定表名称和插入到新记录中的值. INSERT INTO table_name (column_list) VALUES (value_list); insert into `TSubject` (subjectID,subjectName,BookName,Publisher) values ('0004','英语','大学英语走遍美国','清华出版社')

Mysql数据库大量删除操作及谈面向对象中的封装继承和多态原理(图)

Mysql数据库大量删除操作及谈面向对象中的封装继承和多态原理(图)最近进行数据库操作,遇到一个问题,就是大量删除一个数据表中的数据后,由于设定了id是自增的,导致再插入时,默认生成的id会很大,这个时候想要再次插入新的数据,应该怎么办呢?1.明确目前最后一个id的大小select id from tags order by id DESC limit 0,1; 假设返回的是9,则设置数据表从10开始自增 2.修改这个数据表从10开始自增alter table tags auto_increme