【mysql】mysql中存储过程的使用

demo1

需求: 用户根据自己的积分兑换商品;
分析: 整个过程设计2个步骤,1.插入用户-商品兑换关系表中。2.扣除用户积分。3.商品的数量要相应减少。涉及到多张表操作,肯定用存储过程要好一些。

#########################
#用户-商品 兑换关系
#1. 插入记录
#2. 更改用户积分
#3. 更改商品数量
#问题是: 当我用户兑换多个商品时候,我的商品id是一个list这样调用存储过程,难道调用n次?
##########################
DROP PROCEDURE IF EXISTS ttt;
delimiter $$
create PROCEDURE ttt(cuid char(9), ggid VARCHAR(15), num INT)
BEGIN
	declare exit HANDLER for SQLEXCEPTION 
	BEGIN	
		ROLLBACK;
		Select '发生错误,执行回滚,程序终止';
	END;
##执行dml操作##
	insert into tb_cgconver(cid, gid, cgtime) VALUES (cuid, ggid, NOW());
	update tb_customer set cintegrals = cintegrals + 1 where cid LIKE cuid;
	update tb_goods set gstock = gstock - num where gid LIKE ggid;
END$$
delimiter;
call ttt('201500762','123131333', 5);

一些小测试案列,可以拿来熟悉一下语法

##没有异常回滚的
drop PROCEDURE tt
delimiter $$
create PROCEDURE tt(customerid CHAR(9), goodsgid VARCHAR(15))
begin 
	
	insert into tb_cgconver(cid, gid, cgtime) VALUES (customerid, goodsgid, NOW());
	update tb_customer set cintegrals = cintegrals + 1 where cid LIKE customerid;
	
end$$
delimiter;

###插入用户-商品兑换表 修改用户积分
call tt('201500762','123456782' );



create procedure pr_add(a int, b int)
begin 
	declare c int;
	if a is null THEN	
		 set a = 0;
	end if;
	if b is null THEN
			set b = 0;
	end if;
	
	set c = a + b;
	select c as sum;
END;

call pr_add(10, 20);

###################################
drop PROCEDURE ff;
CREATE PROCEDURE ff()
BEGIN
	select * from tb_auto;
	SELECT * from tb_customer;
END

call ff();

参考文献
mysql记录存储过程异常情况
mysql的规范官方

你可能感兴趣的:(数据库)