MysqlのWHILEはカーソルの代わりにサブマスターテーブルの3層遍歴コピーを実現する
8036 ワード
背景:
テスト用例管理を行う場合、テスト用例のコピーを行う必要があります.テスト用例の下にテストステップサブテーブルをマウントし、テストステップの下にテストデータサブテーブルをマウントすることは、一対多の関係です.親テーブルを巡回して親テーブルの各レコードに対応するサブテーブルレコードをコピーすることに関し、最初はカーソルを使用することを考慮していたが、erpはカーソルの効率が低く、テーブルリソースを独占していることを知っていた.だからwhileでやりたいのですが、googleは関連資料を見て、コードを実現しました.コードを共有します.
テスト用例管理を行う場合、テスト用例のコピーを行う必要があります.テスト用例の下にテストステップサブテーブルをマウントし、テストステップの下にテストデータサブテーブルをマウントすることは、一対多の関係です.親テーブルを巡回して親テーブルの各レコードに対応するサブテーブルレコードをコピーすることに関し、最初はカーソルを使用することを考慮していたが、erpはカーソルの効率が低く、テーブルリソースを独占していることを知っていた.だからwhileでやりたいのですが、googleは関連資料を見て、コードを実現しました.コードを共有します.
- CREATE DEFINER=`root`@`%` PROCEDURE `copy_case`(param_caseid int(11))
- BEGIN
- DECLARE maxCnt INT DEFAULT 0;
- DECLARE i INT DEFAULT 0;
- INSERT INTO tc_case(testcasename,description,caselevel,runner,groupid,classname,create_time)
- select concat(testcasename,'.01') testcasename,description,caselevel,runner,groupid,classname,now() create_time
- from tc_case where caseid = param_caseid;
- set @id = LAST_INSERT_ID();
- /** **/
- INSERT INTO tc_step(testcaseid,steptype,stepmethod,description,module,stepid,create_time,classname,oldstepid)
- select @id,steptype,stepmethod,description,module,stepid,now() create_time,classname,id
- from tc_step where testcaseid = param_caseid;
-
- DROP TABLE IF EXISTS Gather_Data_Tmp;
- CREATE TEMPORARY TABLE Gather_Data_Tmp(
- `Tmp_Id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
- `teststepid` int(11) NOT NULL,
- `oldstepid` int(11) NOT NULL,
- PRIMARY KEY (`Tmp_Id`)
- )ENGINE=MyISAM DEFAULT CHARSET=utf8;
-
-
- SET @tSql = concat('INSERT INTO Gather_Data_Tmp (`teststepid`,`oldstepid`)
- SELECT id, oldstepid
- FROM tc_step
- WHERE testcaseid =',@id);
- PREPARE gatherData FROM @tSql;
- EXECUTE gatherData;
- SELECT MIN(`Tmp_Id`) INTO i FROM Gather_Data_Tmp;
- SELECT MAX(`Tmp_Id`) INTO maxCnt FROM Gather_Data_Tmp;
- /** **/
- WHILE i <= maxCnt DO
- set @teststepid = (SELECT teststepid FROM Gather_Data_Tmp WHERE Tmp_Id = i);
- set @oldstepid = (SELECT oldstepid FROM Gather_Data_Tmp WHERE Tmp_Id = i);
-
- INSERT INTO tc_step_data(value,k_key,create_time,type,description,stepid )
- select value,k_key,now() create_time,type,description,@teststepid
- from tc_step_data where stepid = @oldstepid;
- SET i = i + 1;
- END WHILE;
- "font-size: 18px; ">
name="code" class="html"> COMMIT;
- END;