MySQL数据篇(一)存储过程实现简单的数据修改及事务的使用

database

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 INTDEFAULT0; #是否有sql错误

DECLARE timestampTmp int;#当前的时间戳

DECLARE memberSPIDCount INTDEFAULT0;#会员id对应会员数(用于验证传入会员id是否有误)

DECLARE memberTableUpdateCount INTDEFAULT0;#更新t_members表影响的行数

DECLARE allotTableInsertId INTDEFAULT0; #插入t_coin_log表的自增id

DECLARECONTINUE HANDLER FOR SQLEXCEPTION SET err=1;#判断是否有SQL错误,全局

#开启事务

START TRANSACTION;

#赋值timestampTmp

   set timestampTmp=unix_timestamp();

#判断传入会员id是否有误

SELECTCOUNT(1) INTO memberSPIDCount FROM t_members WHERE id = _member_id;

IF memberSPIDCount =0THEN

SET _res =0;

ELSE

#更新

UPDATE t_members SET jing_coin = jing_coin + _coin WHERE id = _member_id;

#获取更新数

SELECT ROW_COUNT() INTO memberTableUpdateCount;

IF memberTableUpdateCount =0THEN

SET err =1;

ENDIF;

#添加分配日志

INSERTINTO t_coin_log(`member_id`,`coin`,`type`,`describe`,`create_time`) VALUES(_member_id,_coin,3,"公司分配",timestampTmp);

#获取插入的自增ID

SELECT@@IDENTITYINTO allotTableInsertId;

IF allotTableInsertId =0THEN

SET err =1;

ENDIF;

#判断事务是否提交

IF err =1THEN

SET _res =0;

ROLLBACK;#回滚事务

ELSE

SET _res =1;

COMMIT;#提交事务

ENDIF;

ENDIF;

END

2、查询,存储过程的调用:传入参数(IN)直接写需要传入的参数,传出参数(OUT)需要补全格式为 @变量名,如调用上述过程

#CALL 过程名(传入参数1,传入参数2,@传出变量),res名称自己取

CALL p_allot_user_coin(3,100,@res);

3、结果,输出结果 返回定义的修改状态_res值

以上是 MySQL数据篇(一)存储过程实现简单的数据修改及事务的使用 的全部内容, 来源链接: utcz.com/z/531810.html

回到顶部