Mysql之WHILE替代游标实现子母表三层遍历拷贝

简介:

背景:

在做测试用例管理的时候,需要做测试用例的拷贝,测试用例下挂载测试步骤子表,测试步骤下挂载测试数据子表,都是一对多的关系。涉及遍历母表根据母表每条记录对应的子表记录进行拷贝,一开始考虑用游标,但是之前做过erp知道游标的效率是比较低的,而且会独占表资源。所以想用while来做,google了一下相关资料,实现了代码,现将代码分享如下

 

 
  1. CREATE DEFINER=`root`@`%` PROCEDURE `copy_case`(param_caseid int(11))  
  2. BEGIN 
  3.      DECLARE maxCnt INT DEFAULT 0;    
  4.      DECLARE i INT DEFAULT 0;    
  5.      INSERT INTO tc_case(testcasename,description,caselevel,runner,groupid,classname,create_time)   
  6.             select concat(testcasename,'.01') testcasename,description,caselevel,runner,groupid,classname,now() create_time   
  7.             from tc_case where caseid =  param_caseid;  
  8.      set @id = LAST_INSERT_ID();  
  9.      /**插入测试步骤**/  
  10.      INSERT INTO tc_step(testcaseid,steptype,stepmethod,description,module,stepid,create_time,classname,oldstepid)   
  11.             select @id,steptype,stepmethod,description,module,stepid,now() create_time,classname,id   
  12.             from tc_step where testcaseid = param_caseid;  
  13.               
  14.     DROP TABLE IF EXISTS Gather_Data_Tmp;            
  15.     CREATE TEMPORARY TABLE Gather_Data_Tmp(    
  16.         `Tmp_Id` INT UNSIGNED NOT NULL AUTO_INCREMENT,    
  17.         `teststepid` int(11) NOT NULL,    
  18.         `oldstepid` int(11) NOT NULL,  
  19.         PRIMARY KEY (`Tmp_Id`)    
  20.     )ENGINE=MyISAM DEFAULT CHARSET=utf8;       
  21.                        
  22.                                                                
  23.     SET @tSql = concat('INSERT INTO Gather_Data_Tmp (`teststepid`,`oldstepid`)     
  24.                                             SELECT id, oldstepid     
  25.                                             FROM tc_step     
  26.                                             WHERE testcaseid =',@id);    
  27.     PREPARE gatherData FROM @tSql;    
  28.     EXECUTE gatherData;    
  29.     SELECT MIN(`Tmp_Id`) INTO i FROM Gather_Data_Tmp;    
  30.     SELECT MAX(`Tmp_Id`) INTO maxCnt FROM Gather_Data_Tmp;    
  31.     /**插入测试数据**/  
  32.     WHILE i <= maxCnt DO    
  33.         set @teststepid = (SELECT teststepid FROM Gather_Data_Tmp WHERE Tmp_Id = i);    
  34.         set @oldstepid = (SELECT oldstepid FROM Gather_Data_Tmp WHERE Tmp_Id = i);  
  35.           
  36.         INSERT INTO tc_step_data(value,k_key,create_time,type,description,stepid )   
  37.             select value,k_key,now() create_time,type,description,@teststepid   
  38.             from tc_step_data where stepid = @oldstepid;  
  39.         SET i = i + 1;    
  40.     END WHILE;  
 
  1. <span style="font-size: 18px; "></span><pre name="code" class="html">    COMMIT
 
  1. END;  

 


本文转自elbertchen 51CTO博客,原文链接:http://blog.51cto.com/linkyou/751993,如需转载请自行联系原作者

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
存储 关系型数据库 MySQL
轻松入门MySQL:揭秘MySQL游标,数据处理的神秘利器(16)
轻松入门MySQL:揭秘MySQL游标,数据处理的神秘利器(16)
511 0
|
存储 SQL 关系型数据库
20. Mysql 游标的定义和使用
20. Mysql 游标的定义和使用
492 1
|
关系型数据库 MySQL Java
使用shardingjdbc执行MySQL游标操作时报错
使用shardingjdbc执行MySQL游标操作时报错
813 3
|
关系型数据库 MySQL
Mysql基础第二十七天,使用游标
Mysql基础第二十七天,使用游标
167 0
Mysql基础第二十七天,使用游标
|
存储 SQL 关系型数据库
MySQL存储过程_触发器_游标——Baidu Comate
MySQL存储过程_触发器_游标——Baidu Comate
280 0
|
存储 SQL 关系型数据库
MySQL游标的创建与使用——Baidu Comate全文SQL-AI生成
MySQL游标的创建与使用——Baidu Comate全文SQL-AI生成
256 0
|
存储 关系型数据库 MySQL
MySQL数据库——存储过程-游标(介绍-声明游标、打开游标、获取游标记录、关闭游标,案例)
MySQL数据库——存储过程-游标(介绍-声明游标、打开游标、获取游标记录、关闭游标,案例)
1547 0
|
存储 关系型数据库 MySQL
mysql 存储过程游标 循环输出select 查询结果
mysql 存储过程游标 循环输出select 查询结果
451 0
|
存储 关系型数据库 MySQL
Mysql数据库 12.SQL语言 储存过程 下 储存过程管理和游标
Mysql数据库 12.SQL语言 储存过程 下 储存过程管理和游标
230 1
|
存储 SQL 关系型数据库
⑩⑤【DB】详解MySQL存储过程:变量、游标、存储函数、循环,判断语句、参数传递..
⑩⑤【DB】详解MySQL存储过程:变量、游标、存储函数、循环,判断语句、参数传递..
332 0

推荐镜像

更多