mysql创建有带异常处理功能事务的存储过程

CREATE DEFINER=`root`@`%` PROCEDURE `procAddVehiclePointsChange`(
in plateNumber varchar(10),in businessType varchar(50),in changeType int,
in value int, in account varchar(50),in remark varchar(100),
out result int
)
begin
DECLARE pointsBefore,pointsAfter INTEGER DEFAULT 100;
declare success integer default 1;
declare grade integer default 2;
-- 车辆积分表中是否有此车
declare hasPoints integer default 0;
-- 定义异常处理程序,如果有异常则回滚事务,并输出异常信息
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
BEGIN
  ROLLBACK;
  GET DIAGNOSTICS CONDITION 1
        @error_code = RETURNED_SQLSTATE,
        @error_message = MESSAGE_TEXT;

    -- 输出异常信息
     SELECT CONCAT('Error Code:', @error_code) AS 'Error', CONCAT('Error Message:', @error_message) AS 'Message';
END;
select count(0) into hasPoints from  tms_vehicle_points where plate_number = plateNumber;
-- 取出车辆变更前的积分
if hasPoints = 1 then 
	SELECT points into pointsBefore FROM tms_vehicle_points where plate_number = plateNumber;
end if;
-- 计算变更后的积分
if changeType = 0 then
	set pointsAfter = pointsBefore + value;
else
	set pointsAfter = pointsBefore - value;
end if;

-- 根据变更后的积分设置车辆等级
if pointsAfter < 61 then
	set grade = 0;
else
		if pointsAfter < 81 then
			 set grade = 1;
	  else
				if pointsAfter < 101 then 
					set grade = 2;
			  else
						if pointsAfter < 121 then
							set grade = 3;
						else
								if pointsAfter < 141 then
									set grade = 4;
								else
									set grade = 5;
								end if;
						end if;
				end if;
		end if;
end if;

-- 开始事务
START TRANSACTION;
-- 如果车辆积分表中无此车辆则直接插入,否则更新车辆积分
if hasPoints = 0 then
	INSERT INTO `tms`.`tms_vehicle_points`(`grade`, `plate_number`, `points`, `create_time`, `create_by`,  `remark`) VALUES ( grade, plateNumber, pointsAfter, now(), account,remark);
else
UPDATE `tms`.`tms_vehicle_points` SET `grade` = grade, `points` = pointsAfter,  `update_by` = account, `update_time` = now(), `remark` = remark WHERE `plate_number` = plateNumber;
end if;


if ROW_COUNT() > 0 then
	-- 如果影响行数大于0则继续新增加积分变更记录
	INSERT INTO `tms`.`tms_vehicle_points_change`(`plate_number`, `before_change`, `after_change`, `change_type`, `business_type`, `create_time`, `create_by`, `remark`, `update_by`, `update_time`, `value`) VALUES (plateNumber, pointsBefore, pointsAfter, changeType, businessType, now(), account, remark, null, null, value);
end if;
if row_count() = 0 then
	set success = 0;
end if;
 
 IF success = 1 THEN
        COMMIT;
    ELSE
        ROLLBACK;
 END IF;
 set result = success;
END
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值