`

MySQL存储过程使用游标删除多表数据

阅读更多
注:游标只有在打开的时候才能使用,用完必须关闭之。

错误存储过程参数:

IN esCorCode varchar(20),IN intoOrderTableName varchar(30),IN outWareHouseTableName varchar(30),IN startTime varchar(50),IN endTime varchar(50)

错误存储过程:
BEGIN
-- CALL P_DELETE_SERVICE_DATA2('10000','WM_INTO_ORDER_10000','WM_OUT_ORDER_10000','2015-12-23 15:00:00','2015-12-23 15:58:00');

DECLARE count INT;
-- 游标不支持动态表
[color=red]DECLARE cur_in CURSOR FOR SELECT COUNT(WMIO_ID) FROM intoOrderTableName WHERE WMIO_COMPLETION_TIME BETWEEN startTime AND endTime;

DECLARE cur_out CURSOR FOR SELECT COUNT(WMOO_ID) FROM outWareHouseTableName WHERE SURE_DATE BETWEEN startTime AND endTime;[/color]

SET @index_=1;
-- ---------------------------------------------业务数据表-------------------------------------------------------
SET @array_tables=CONCAT('WM_INTO_ORDER');                       -- 入库表

SET @array_tables=CONCAT(@array_tables,',','WM_OUT_ORDER');      -- 出库表

SET @array_tables=CONCAT(@array_tables,',','WM_WAREHOUSE_MOVE'); -- 移库表

SET @array_tables=CONCAT(@array_tables,',','WM_BATCH_PICKING');  -- 波次表

SET @array_tables=CONCAT(@array_tables,',','EB_SYS_LOG');        -- 系统日志表

SET @array_tables=CONCAT(@array_tables,',','EB_OPERATE_LOG');    -- 操作日志表

SET @array_tables=CONCAT(@array_tables,',','EB_INTO_STOCK_LOG'); -- 入库日志表

SET @array_tables=CONCAT(@array_tables,',','EB_OUT_STOCK_LOG');  -- 出库日志表

-- ---------------------------------------------业务数据表对应字段------------------------------------------------

SET @array_fields=CONCAT('WMIO_COMPLETION_TIME');              --  入库表    完成时间标识

SET @array_fields=CONCAT(@array_fields,',','SURE_DATE');       --  出库表    出库确认时间标识

SET @array_fields=CONCAT(@array_fields,',','WWM_COMPLETION_TIME');     --  移库表    完成时间标识

SET @array_fields=CONCAT(@array_fields,',','RE_TIME');         --  波次表            波次释放时间标识

SET @array_fields=CONCAT(@array_fields,',','CREATE_TIME');     --  系统日志表        创建时间标识

SET @array_fields=CONCAT(@array_fields,',','CREATE_TIME');     --  操作日志表        创建时间标识

SET @array_fields=CONCAT(@array_fields,',','CREATE_TIME');     --  入库日志表        创建时间标识

SET @array_fields=CONCAT(@array_fields,',','CREATE_TIME');     --  出库日志表        创建时间标识
-- ---------------------------------------------计算循环次数------------------------------------------------------         
SET @table_count=CHAR_LENGTH(@array_tables)-CHAR_LENGTH(REPLACE(@array_tables,',',''))+1; 

-- ---------------------------------------------执行业务数据操作--------------------------------------------------
WHILE @index_ <= @table_count DO

  SET @table_prex=SUBSTRING_INDEX(SUBSTRING_INDEX(@array_tables,',',@index_),',',-1);

  SET @table_name=CONCAT(@table_prex,'_',esCorCode);

  SET @fieldName=SUBSTRING_INDEX(SUBSTRING_INDEX(@array_fields,',',@index_),',',-1);

  SET @delete_data=CONCAT('delete from ',@table_name ,' where ',@fieldName,' between ','"',startTime,'"',' and ','"',endTime,'"');

  -- 入库单删除时删除对应的:入库明细、收货信息、退回信息
  IF @table_prex = 'WM_INTO_ORDER' THEN

       OPEN cur_in;

       FETCH cur_in INTO count;

       IF count>0 THEN
           -- 查询符合条件的入库单ID
           SET @into_order_ids=CONCAT('SELECT WMIO_ID FROM ',@table_name,' where ',@fieldName,' between ','"',startTime,'"',' and ','"',endTime,'"');

           SET @into_orderinfo_ids=CONCAT('SELECT WMOF_ID FROM WM_INTO_ORDERINFO_',esCorCode,' where  WMOF_IO_ID in ','(',@into_order_ids,')');

           -- 删除 入库ID对应的入库明细
           SET @WM_INTO_ORDERINFO=CONCAT('WM_INTO_ORDERINFO_',esCorCode);

           SET @delete_into_orderinfo=CONCAT('delete from ',@WM_INTO_ORDERINFO,' where  WMOF_IO_ID in ','(',@into_order_ids,')');

           -- 删除 入库ID对应的收货信息
           SET @WM_RECEIPT_INFO=CONCAT('WM_RECEIPT_INFO_',esCorCode);

           SET @delete_receipt_info=CONCAT('delete from ',@WM_RECEIPT_INFO,' where  WMRPS_OF_ID in ','(',@into_orderinfo_ids,')');

           -- 删除 入库ID对应的退货信息
           SET @WM_RETURN_INFO=CONCAT('WM_RETURN_INFO_',esCorCode);

           SET @delete_return_info=CONCAT('delete from ',@WM_RETURN_INFO,' where WMSP_OF_ID in ','(',@into_orderinfo_ids,')');

           -- 删除过程中要注意删除顺序
           prepare delete_talbe_data from @delete_receipt_info; 
           execute delete_talbe_data; 

           prepare delete_talbe_data from @delete_return_info; 
           execute delete_talbe_data; 

           prepare delete_talbe_data from @delete_into_orderinfo; 
           execute delete_talbe_data; 

           prepare delete_talbe_data from @delete_data; 
           execute delete_talbe_data; 

       END IF;

       CLOSE cur_in;

 --  删除出库对应的出库详情及出库计划
 ELSEIF @table_prex = 'WM_OUT_ORDER' THEN

       OPEN cur_out;

       FETCH cur_out INTO count;

       IF count>0 THEN
           -- 查询符合条件的出库单ID
           SET @out_order_ids=CONCAT('SELECT WMOO_ID FROM ',@table_name,' where ',@fieldName,' between ','"',startTime,'"',' and ','"',endTime,'"');

           -- 删除 出库ID对应的出库明细
           SET @WM_OUT_ORDER_DETAIL=CONCAT('WM_OUT_ORDER_DETAIL_',esCorCode);

           SET @delete_out_order_detail=CONCAT('delete from ',@WM_OUT_ORDER_DETAIL,' where ' ,' WMOD_OUT_ORDER_ID in ','(',@out_order_ids,')');

           SET @delete_data=CONCAT(@delete_out_order_detail,';',@delete_data,';');

           prepare delete_talbe_data from @delete_data; 

           execute delete_talbe_data; 

       END IF;

       CLOSE cur_out;
 ELSE

   prepare delete_talbe_data from @delete_data; 

   execute delete_talbe_data; 

 END IF;
 
  SET @index_=@index_+1; 

END WHILE; 

END


修改方案:
通过游标查询视图获得游标需要的值。
-- ---------------------------------------------创建视图-------------------------------------开始---------------------------
drop view if exists view_into_table;
set @view_into_sql=concat("create view view_into_table as select COUNT(WMIO_ID) count from  WM_INTO_ORDER_",esCorCode,' WHERE WMIO_COMPLETION_TIME ',' between ','"',startTime,'"',' and ','"',endTime,'"');
PREPARE stmt FROM  @view_into_sql;
EXECUTE stmt;

drop view if exists view_out_table;
set @view_out_sql=concat("create view view_out_table as select COUNT(WMOO_ID) count from WM_OUT_ORDER_",esCorCode,' WHERE SURE_DATE ',' between ','"',startTime,'"',' and ','"',endTime,'"');
PREPARE stmt FROM  @view_out_sql;
EXECUTE stmt;
-- ---------------------------------------------创建视图-------------------------------------结束---------------------------
分享到:
评论

相关推荐

    sql总结.doc

    如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,也要花费一定的时间。 2.修改限制:当用户试图修改视图的某些行时,数据库必须把它转化为对基本表的某些行的修改。对于简单视图来说,...

    2021年MySQL高级教程视频.rar

    16.MySQL高级存储过程创建调用查询删除语法.avi 17.MySQL高级存储过程语法变量.avi 18.MySQL高级存储过程语法if判断.avi 19.MySQL高级存储过程语法输入参数.avi 20.MySQL高级存储过程语法输出参数.avi 21.MySQL高级...

    mysql触发器,游标

    是和表关联的特殊的存储过程,可以再插入,删除,修改表中的数据时触发执行 优点: 安全性,审计(可以跟踪用户对数据的操作),实现复杂的数据完整性规则,提供了运行计划任务的另一种方法。 缺点: 消耗资源,对...

    MySQL高级教程视频.zip

    16.存储过程 - 创建调用查询删除语法 17.存储过程 - 语法 - 变量 18.存储过程 - 语法 - if判断 19.存储过程 - 语法 - 输入参数 20.存储过程 - 语法 - 输出参数 21.存储过程 - 语法 - case结构 22.存储过程 - 语法 - ...

    MySQL 速成课程,第二版

    MySQL 是最流行的数据库管理系统之一,为从互联网巨头到个人企业数据库到简单的最终用户应用程序以及介于两者...利用存储过程和触发器的强大功能 使用视图和游标 管理事务处理 创建用户帐户并通过访问控制管理安全性

    PHP和MySQL Web开发第4版pdf以及源码

    12.1.4 访问控制:MySQL如何使用Grant表 12.1.5 更新权限:修改什么时候生效 12.2 提高MySQL数据库的安全性 12.2.1 从操作系统角度来保护MySQL 12.2.2 密码 12.2.3 用户权限 12.2.4 Web问题 12.3 获取更多...

    PHP和MySQL WEB开发(第4版)

    12.1.4 访问控制:MySQL如何使用Grant表 12.1.5 更新权限:修改什么时候生效 12.2 提高MySQL数据库的安全性 12.2.1 从操作系统角度来保护MySQL 12.2.2 密码 12.2.3 用户权限 12.2.4 Web问题 12.3 获取更多关于数据库...

    mysql数据库的基本操作语法

    唯一约束不仅可以在一个表内创建,而且可以同时多表创建组合唯一约束。 MySQL会给唯一约束的列上默认创建一个唯一索引; create table temp ( id int not null, name varchar(25), password varchar(16), --使用表级...

    SQL必知必会(第3版 中文高清版)

    第19章 使用存储过程  第20章 管理事务处理  .第21章 使用游标  第22章 了解高级sql特性  附录a 样例表脚本   a.1 样例表   a.2 获得样例表   a.2.1 下载可供使用的microsoft access mdb文件   ...

    SQL_SERVER应用与开发范例宝典_12357672.part2

    涉及到SQLServer2000、SQLServer2005、Access、Oracle10g、MySql5.0和Postgresql8.2等6种数据库语言,内容包括SQL语言基础、常规数据查询、高级数据过滤、字符串查询、日期函数、日期函数、数据排序、聚集函数与分组...

    SQL_SERVER应用与开发范例宝典_12357672.part1

    涉及到SQLServer2000、SQLServer2005、Access、Oracle10g、MySql5.0和Postgresql8.2等6种数据库语言,内容包括SQL语言基础、常规数据查询、高级数据过滤、字符串查询、日期函数、日期函数、数据排序、聚集函数与分组...

    SQL应用开发范例宝典:SQL应用开发范例宝典.iso (源码光盘)

    涉及到SQLServer2000、SQLServer2005、Access、Oracle10g、MySql5.0和Postgresql8.2等6种数据库语言,内容包括SQL语言基础、常规数据查询、高级数据过滤、字符串查询、日期函数、日期函数、数据排序、聚集函数与分组...

    SQL_SERVER应用与开发范例宝典_12357672.part3

    涉及到SQLServer2000、SQLServer2005、Access、Oracle10g、MySql5.0和Postgresql8.2等6种数据库语言,内容包括SQL语言基础、常规数据查询、高级数据过滤、字符串查询、日期函数、日期函数、数据排序、聚集函数与分组...

    PHP和MySQL Web开发第4版

    12.1.4 访问控制:MySQL如何使用Grant表 12.1.5 更新权限:修改什么时候生效 12.2 提高MySQL数据库的安全性 12.2.1 从操作系统角度来保护MySQL 12.2.2 密码 12.2.3 用户权限 12.2.4 Web问题 12.3 获取更多...

    存储图数据的数据库FlockDB.zip

    FlockDB是一个存储图数据的数据库,但是它并没有优化遍历图的操作。它优化的操作包括:超大规模邻接矩阵查询,快速读写和可分页查询。FlockDB将图存储为一个边的集合,每条边用两个代表顶点的64位整数表示。对于一个...

    python的mysql数据库建立表与插入数据操作示例

    本文实例讲述了python的mysql数据库建立表与插入数据操作。分享给大家供大家参考,具体如下: mysql数据库建立表 一 代码 import pymysql # 打开数据库连接 db = pymysql.connect("localhost","root","root","db_...

    SQL必知必会(第3版)--详细书签版

    本书涉及不同平台上数据的排序、过滤和分组,以及表、视图、联结、子查询、游标、存储过程和触发器等内容,通过本书读者可以系统地学习到sql 的知识和方法。  本书注重实用性,操作性很强,适合于sql 的初学者学习...

    MYSQL必知必会读书笔记第二章之版本更改

    您可能感兴趣的文章:批处理命令 BAT备份MySQL数据库MySQL 备份还原数据库批处理MySQL数据入库时特殊字符处理详解php+mysqli预处理技术实现添加、修改及删除多条数据的方法MySQL中的max()函数使用教程使用My

    SQL必知必会(第3版-PDF清晰版)part1

    第19章 使用存储过程...... 123 19.1 存储过程..... 123 19.2 为什么要使用 存储过程..... 124 19.3 执行存储过程..... 125 19.4 创建存储过程..... 126 19.5 小结..... 129 第20章 管理事务处理...... 130 20.1 ...

    MySQL大作业 课程作业-----考勤人事管理系统

    文件内容包括数据库数据、表设计、约束、默认、索引设计、多种查询、视图设计、触发器设计、 存储过程设计、函数设计、游标和用户、角色、权限等等。 (1)登录功能 系统有两类用户:普通员工、管理员,根据登录用户...

Global site tag (gtag.js) - Google Analytics