MysqlのWHILEはカーソルの代わりにサブマスターテーブルの3層遍歴コピーを実現する


背景:
テスト用例管理を行う場合、テスト用例のコピーを行う必要があります.テスト用例の下にテストステップサブテーブルをマウントし、テストステップの下にテストデータサブテーブルをマウントすることは、一対多の関係です.親テーブルを巡回して親テーブルの各レコードに対応するサブテーブルレコードをコピーすることに関し、最初はカーソルを使用することを考慮していたが、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. "font-size: 18px; ">
    name="code" class="html">    COMMIT
  2.    
       
       
       
    1. END;