MySQL数据篇 (一)存储过程实现简单的数据修改及事务的使用
1、需求,手动给会员新增京币,并且添加分配日志,返回修改是否成功
CREATE DEFINER=`jszapi`@`%` PROCEDURE `p_allot_user_coin`(IN `_member_id` int,IN `_coin` int,OUT `_res` tinyint) BEGIN /* 用途:给会员手动分配京币 作者:Mo 创建时间:2019-12-16 参数: _member_id : 会员id _coin : 分配京币数量 _res : 执行结果,1表示成功,0表示失败 */ DECLARE err INT DEFAULT 0; #是否有sql错误 DECLARE timestampTmp int;#当前的时间戳 DECLARE memberSPIDCount INT DEFAULT 0;#会员id对应会员数(用于验证传入会员id是否有误) DECLARE memberTableUpdateCount INT DEFAULT 0;#更新t_members表影响的行数 DECLARE allotTableInsertId INT DEFAULT 0; #插入t_coin_log表的自增id DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET err=1;#判断是否有SQL错误,全局 #开启事务 START TRANSACTION; #赋值timestampTmp set timestampTmp=unix_timestamp(); #判断传入会员id是否有误 SELECT COUNT(1) INTO memberSPIDCount FROM t_members WHERE id = _member_id; IF memberSPIDCount = 0 THEN SET _res = 0; ELSE #更新 UPDATE t_members SET jing_coin = jing_coin + _coin WHERE id = _member_id; #获取更新数 SELECT ROW_COUNT() INTO memberTableUpdateCount; IF memberTableUpdateCount = 0 THEN SET err = 1; END IF; #添加分配日志 INSERT INTO t_coin_log(`member_id`,`coin`,`type`,`describe`,`create_time`) VALUES(_member_id,_coin,3,'公司分配',timestampTmp); #获取插入的自增ID SELECT @@IDENTITY INTO allotTableInsertId; IF allotTableInsertId = 0 THEN SET err = 1; END IF; #判断事务是否提交 IF err = 1 THEN SET _res = 0; ROLLBACK;#回滚事务 ELSE SET _res = 1; COMMIT;#提交事务 END IF; END IF; END
2、查询,存储过程的调用:传入参数(IN)直接写需要传入的参数,传出参数(OUT)需要补全格式为 @变量名,如调用上述过程
#CALL 过程名(传入参数1,传入参数2,@传出变量),res名称自己取 CALL p_allot_user_coin(3,100,@res);
3、结果,输出结果 返回定义的修改状态_res值
-----END
影子是一个会撒谎的精灵,它在虚空中流浪和等待被发现之间;在存在与不存在之间....