CREATE DEFINER=`root`@`localhost` PROCEDURE `transaction_savepoint`(IN custId char,IN orderNum INT(10))
label:BEGIN
-- mysql 异常规范
-- DECLARE [action] HANDLER FOR [condition_value] [statement];
-- 如果条件的值与condition_value匹配,则MySQL将执行statement,并根据该操作继续或退出当前的代码块。
-- action:
-- CONTINUE:继续执行封闭代码块(BEGIN ... END)。
-- EXIT:处理程序声明封闭代码块的执行终止。
-- condition_value指定一个特定条件或一类激活处理程序的条件。condition_value接受以下值之一:
-- 一个MySQL错误代码
-- 标准SQL-STATE值或者它可以是SQL-WARNING,NOT-FOUND或SQL-EXCEPTION条件,这是SQL-STATE值类的简写。NOT-FOUND条件用于游标或SELECT INTO variable_list语句。( -符号不需要)
-- 与MySQL错误代码或SQLSTATE值相关联的命名条件。
-- 该语句可以是一个简单的语句或由BEGIN和END关键字包围的复合语句。
DECLARE has_err INT DEFAULT 0;
DECLARE EXIT HANDLER FOR 1062 SELECT CONCAT('Duplicate entry',custId,'for key PRIMARY');
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET has_err = 1;
START TRANSACTION;
INSERT INTO `sql_inform`.`customers`(`cust_id`, `cust_name`, `cust_address`, `cust_city`, `cust_state`, `cust_zip`, `cust_country`, `cust_contact`, `cust_email`) VALUES (custId, 'Toy Land', '123 Any Street', 'New York', 'NY', '11111', 'USA', NULL, NULL);
-- 定义保存点
SAVEPOINT backpoint0;
DELETE FROM orderitems WHERE order_num = orderNum;
IF has_err = 1 THEN
-- 如果发生错误,回退到指定保持点的位置
ROLLBACK TO backpoint0;
SELECT 'orderitems ROLLBACK TO backpoint0' err_msg;
LEAVE label; # 退出存储过程
END IF;
-- 错误语句 orders_num
DELETE FROM orders WHERE orders_num = orderNum;
IF has_err = 1 THEN
-- 如果发生错误,回退到指定保持点的位置
ROLLBACK TO backpoint0;
SELECT 'orders ROLLBACK TO backpoint0' err_msg;
LEAVE label; # 退出存储过程
END IF;
COMMIT;
END
网友评论