`

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;
-- ---------------------------------------------创建视图-------------------------------------结束---------------------------
分享到:
评论

相关推荐

    mysql存储过程_游标_项目练习

    MySQL存储过程是数据库管理系统中一组为了完成特定功能的SQL语句集,它可以被保存和重复使用,提高了数据库的效率和可维护性。在本项目实践中,我们将深入学习和运用MySQL的存储过程,同时结合游标这一重要工具进行...

    Mysql游标(循环操作)

    在MySQL中,游标是一种数据库对象,主要用于处理存储过程中的结果集。游标允许我们逐行地读取查询结果,这对于需要对每一行数据执行特定操作的情况非常有用。通过使用游标,我们可以实现更加灵活的数据处理逻辑。 #...

    Mysql中sql语句游标详解

    ### MySQL中SQL语句游标...通过对MySQL中游标概念及使用方法的详细介绍,可以看出游标为数据库开发者提供了一种灵活而强大的数据处理工具。掌握游标的使用技巧,可以帮助开发者更加高效地处理数据库中的复杂查询结果。

    游标、存储过程的使用事例

    ### 游标与存储过程在SQL Server中的...游标提供了灵活的数据检索方式,而存储过程则简化了复杂数据库操作的过程,提高了应用程序的性能和可维护性。在实际开发中,合理运用这些技术可以极大地提升系统的稳定性和效率。

    MySQL实验报告5(存储过程与函数)(1)(1).pdf

    根据提供的文件内容,本篇实验报告主要围绕MySQL数据库中存储过程和函数的应用,涵盖了创建存储过程、函数、游标以及异常处理等高级特性。下面将详细解析报告中的每个知识点。 1. 创建存储过程 存储过程是一种在...

    mysql动态游标学习(mysql存储过程游标)

    在本示例中,我们将深入探讨如何在MySQL中使用动态游标,特别是结合存储过程来实现这一功能。 首先,创建了一个名为`webuser`的测试表,用于存放用户名数据。接着插入了一些示例数据,包括以'a'和'b'开头的用户。这...

    不使用游标完成循环功能(下)

    不带标识的临时表方法通过创建一个临时表存储数据,然后逐条取出并处理这些数据,直至所有数据都被处理完毕。这种方法的核心在于使用临时表结合`WHILE`循环结构来模拟游标的行为,从而避免了游标带来的性能问题。 *...

    mysql的存储过程、游标 、事务实例详解

    MySQL的存储过程、游标和事务是数据库管理中非常重要的概念,它们在处理大量数据和实现复杂的业务逻辑时起着关键作用。以下是对这些概念的详细解释和实例分析。 **存储过程**: 存储过程是一组预编译的SQL语句,以...

    存储过程:利用游标+临时表实现查询

    - **事务处理**:在执行复杂操作如多表更新、插入、查询、删除时,存储过程可以与事务处理相结合,保证数据的一致性和完整性。 - **安全性**:可以设置特定用户对存储过程的访问权限,增强数据库的安全性。 2. ...

    精准掌控数据流:MySQL游标在批量更新和删除中的应用

    在这个示例中,我们定义了一个名为 `UpdateBatch` 的存储过程,该过程使用游标逐行读取 `Employees` 表中的数据,并将每一行的名字字段前加上 "Updated_" 字符串。 ##### 2. 调用存储过程 编写好存储过程之后,就...

    MySQL游标:数据库操作的精准定位器

    下面是一个MySQL存储过程中使用游标的示例代码: ```sql DELIMITER $$ CREATE PROCEDURE FetchEmployees() BEGIN DECLARE done INT DEFAULT FALSE; DECLARE emp_id INT; DECLARE emp_name VARCHAR(255); ...

    过程和游标实验.rar

    在数据库管理领域,过程和游标是两种非常重要的概念,特别是在使用结构化查询语言(SQL)进行编程时。过程和游标在数据库操作中扮演着关键角色,它们帮助开发者实现更复杂的逻辑和数据处理。 **过程(Procedure)**...

    MYSQL数据库高级应用宝典含实例(索引、视图、触发器、游标和存储过程)

    MYSQL 数据库高级应用宝典含实例(索引、视图、触发器、游标和存储过程) MYSQL 数据库高级应用宝典含实例中,涵盖了索引、视图、触发器、游标和存储过程等高级应用领域。下面我们将逐一介绍这些高级应用领域的知识点...

    MySQL存储过程经典教程

    MySQL存储过程是数据库管理系统中的一种重要功能,它允许开发者预编译一组SQL语句并封装成一个可重复使用的对象。这个经典教程旨在深入探讨存储过程的各个方面,帮助读者掌握这一强大的数据库编程工具。 1. **存储...

    mysql存储过程中使用游标的实例

    这个实例展示了如何在MySQL存储过程中使用游标处理数据,通过逐行读取和更新记录,实现了特定业务逻辑的需求。在实际应用中,这样的存储过程可以提高代码的复用性和效率,同时简化复杂操作的管理。

    SQL经典游标使用方法

    例如,可以使用存储过程、递归查询或者窗口函数来替代游标。 综上所述,理解并熟练掌握SQL游标是提升数据库操作能力的重要步骤。通过游标,我们可以实现更加灵活和精细的数据处理,但也需要注意在性能和灵活性之间...

    MySQL存储过程 参考查阅资料

    MySQL存储过程是数据库管理系统中的一种重要功能,它允许程序员或数据库管理员预编译一系列SQL语句,形成一个可重复执行的单元,以提高数据库操作的效率和便捷性。在这个“MySQL存储过程参考查阅资料”中,你可以...

Global site tag (gtag.js) - Google Analytics