现在有一个作业,分为三个SP来执行,分别为SP_1,SP_2,SP_3,为了能在发生错误时回滚整个作业,现在在一个SP里面调用这个三个SP:CREATE PROCEDURE SP
BEGIN
START TRANSACTION; CALL SP_1;
CALL SP_2;
CALL SP_3; COMMITE;
END但是这样似乎不能实现上述的需求,在SP_2调用出错时,并没有回滚。
BEGIN
START TRANSACTION; CALL SP_1;
CALL SP_2;
CALL SP_3; COMMITE;
END但是这样似乎不能实现上述的需求,在SP_2调用出错时,并没有回滚。
CREATE PROCEDURE SP
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK;
START TRANSACTION;
CALL SP_1;
CALL SP_2;
CALL SP_3;
COMMITE;
END
TestProjectID INT
,UserID INT
,TemporaryTableName VARCHAR(100)
)
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK; START TRANSACTION;
/*alter temporary table*/
CALL SP_PrepareTemporaryTable (TemporaryTableName); /*import testsuites*/
CALL SP_ImportTestSuites (TestProjectID, TemporaryTableName); /*import testcases*/
CALL SP_ImportTestCases (TestProjectID, UserID, TemporaryTableName); COMMIT;
END
TestProjectID INT
,UserID INT
,TemporaryTableName VARCHAR(100)
)
BEGIN
#insert data into nodes_hierarchy
#insert testcase
SET @InsertData = CONCAT('INSERT INTO `nodes_hierarchy` (`name`,`parent_id`,`node_type_id`,`node_order`)
SELECT A.`Name`,B.`NodeID`,3,A.`OrderNO`
FROM `', TemporaryTableName, '` A INNER JOIN `', TemporaryTableName, '` B
ON A.`ParentName` = B.`Name`
AND A.`Level` = B.`Level` + 1
AND A.`Type` = ''C''
AND B.`Type` = ''S''');
PREPARE InsertData FROM @InsertData;
EXECUTE InsertData;
DEALLOCATE PREPARE InsertData; #update `NodeID` from temp table
SET @UpdateNodeID = CONCAT('UPDATE `', TemporaryTableName, '` A INNER JOIN `', TemporaryTableName, '` B
ON A.`ParentName` = B.`Name`
AND A.`Level` = B.`Level` + 1
AND A.`Type` = ''C''
AND B.`Type` = ''S''
INNER JOIN `nodes_hierarchy` C
ON A.`Name` = C.`name`
AND B.`NodeID` = C.`parent_id`
SET A.`NodeID` = C.`id`'); PREPARE UpdateNodeID FROM @UpdateNodeID;
EXECUTE UpdateNodeID;
DEALLOCATE PREPARE UpdateNodeID;
#insert data into nodes_hierarchy
#insert testversion
SET @InsertData = CONCAT('INSERT INTO `nodes_hierarchy` (`name`,`parent_id`,`node_type_id`,`node_order`)
SELECT '''',`NodeID`,4,0 FROM ', TemporaryTableName , ' WHERE `Type` = ''C'''); PREPARE InsertData FROM @InsertData;
EXECUTE InsertData;
DEALLOCATE PREPARE InsertData; #insert data into tcversions
SET @InsertData = CONCAT('INSERT INTO `tcversions` SELECT B.`id`,'
,TestProjectID
,',1,1,1,A.`Summary`,NULL,2,'
,UserID
,',NOW(),NULL,''0000-00-00 00:00:00'',1,1,1 FROM '
,TemporaryTableName, ' A JOIN `nodes_hierarchy` B ON A.`NodeID` = B.`parent_id`'
,' WHERE A.`Type` = ''C'''); PREPARE InsertData FROM @InsertData;
EXECUTE InsertData;
DEALLOCATE PREPARE InsertData; #insert data into nodes_hierarchy
#insertsteps
SET @InsertData = CONCAT('INSERT INTO `nodes_hierarchy` (`name`,`parent_id`,`node_type_id`,`node_order`)
SELECT '''',B.`id`,9,0
FROM ', TemporaryTableName ,' A JOIN `nodes_hierarchy` B
ON A.`Type` = ''C''
AND B.`node_type_id` = 4
AND A.`NodeID` = B.`parent_id`'); PREPARE InsertData FROM @InsertData;
EXECUTE InsertData;
DEALLOCATE PREPARE InsertData; #insert data into tcsteps
SET @InsertData = CONCAT('INSERT INTO `tcsteps`
SELECT B.`id`,1,A.`Steps`,A.`Results`,1,1
FROM (
SELECT A.`Type`,A.`Steps`,A.`Results`,B.`id` AS `NodeID`
FROM ', TemporaryTableName, ' A JOIN `nodes_hierarchy` B
ON A.`NodeID` = B.`parent_id`
AND A.`Type` = ''C''
AND B.`node_type_id` = 4
) A JOIN `nodes_hierarchy` B
ON A.`NodeID` = B.`parent_id`
AND B.`node_type_id` = 9
AND A.`Type` = ''C'''); PREPARE InsertData FROM @InsertData;
EXECUTE InsertData;
DEALLOCATE PREPARE InsertData; #insert custom_fields
SET @GetCfieldsP = CONCAT('SELECT GROUP_CONCAT(''SELECT `NodeID`,`name`,'''''',A.`name`,'''''' AS CfieldName,`'',A.`name`,''` AS CfieldValue FROM '
, TemporaryTableName ,' WHERE TYPE=''''C'''''' SEPARATOR '' UNION ALL '') INTO @GetCfields
FROM `custom_fields` A INNER JOIN `cfield_testprojects` B ON A.`id` = B.`field_id`
AND B.`testproject_id` = ', TestProjectID ,'
INNER JOIN `cfield_node_types` C ON A.`id` = C.`field_id`
AND C.`node_type_id` = 3');
PREPARE GetCfieldsP FROM @GetCfieldsP; EXECUTE GetCfieldsP; DEALLOCATE PREPARE GetCfieldsP; SET @InsertData = CONCAT('INSERT INTO `cfield_design_values`
SELECT B.`id`,E.`id`,A.`CfieldValue`
FROM (', @GetCfields ,') A INNER JOIN `custom_fields` B ON A.`CfieldName` = B.`name`
AND IFNULL(A.`CfieldValue`, '''') <> ''''
INNER JOIN `cfield_testprojects` C ON B.`id` = C.`field_id`
AND C.`testproject_id` = ' ,TestProjectID, '
INNER JOIN `cfield_node_types` D ON B.`id` = D.`field_id`
AND D.`node_type_id` = 3
INNER JOIN `nodes_hierarchy` E ON A.`NodeID` = E.`parent_id`
AND E.`node_type_id` = 4'); PREPARE InsertData FROM @InsertData;
EXECUTE InsertData;
DEALLOCATE PREPARE InsertData;
END