一个mysql存储过程示例,循环、监测报错

begin
        -- 循环标志
	declare stopflag int default 0;
	-- 出错标志
	DECLARE t_error INTEGER DEFAULT 0;
	declare m_userId bigint default 0;
	declare m_customerId bigint default 0;
	declare m_status int default 0;
	declare m_goodId bigint default 0;
	declare m_count int default 0;
	DECLARE cur1 CURSOR for select goodId,count from applyformitem where applyFormId=m_applyFormId;

	declare continue handler for not found set stopflag=1;
	DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1;
	-- 开启事务
	START TRANSACTION;
	set m_result=0;
	-- 打开游标
	OPEN cur1;
		select userId,customerId,status into m_userId,m_customerId,m_status from applyform where id=m_applyFormId;
		IF m_status=1 THEN
			-- 已经兑换
			set m_result=-1;
			set t_error=1;
		ELSE
			-- 尚未兑换
			FETCH cur1 INTO m_goodId,m_count;
			while(stopflag=0) DO # 如果游标还没到结尾,就继续循环
				begin
					UPDATE customer set rePoints=rePoints-(select points from good where id=m_goodId)*m_count where id=m_customerId;
					UPDATE customer set drawRePoints=drawRePoints-(select points from good where id=m_goodId)*m_count where id=m_customerId;
					UPDATE inventory set reCount=reCount-m_count where orgId=(select orgId from user where id=m_userId) and goodId=m_goodId;
					if (select rePoints from customer where id=m_customerId)<0 THEN
						-- 客户积分不足
						set m_result=-2;
						set t_error=1;
					end if;
					if (select drawRePoints from customer where id=m_customerId)<0 THEN
						-- 抽奖积分不足,设置为0
						UPDATE customer set drawRePoints=0 where id=m_customerId;
					end if;
					if (select reCount from inventory where orgId=(select orgId from user where id=m_userId) and goodId=m_goodId)<0 THEN
						-- 库存积分不足
						set m_result=-3;
						set t_error=1;
					end if;
					FETCH cur1 INTO m_goodId,m_count;
				end;
			end while;
		end if;
	-- 关闭游标
	CLOSE cur1;
	UPDATE applyform set status=1,updateTime=now() where id=m_applyFormId;
	IF t_error = 1 THEN
		ROLLBACK;    
	ELSE    
		set m_result=1;
		COMMIT;    
	END IF;
	/*开始初始化变量*/
END

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

think4code

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值