MySQL数据篇 (一)存储过程实现简单的数据修改及事务的使用
短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
需求,手动给会员新增京币,并且添加分配日志,返回修改是否成功
CREATE DEFINER=`jszapi`@`%` PROCEDURE `p_allot_user_coin`(IN `_member_id` int,IN `_coin` int,OUT `_res` tinyint)
BEGIN
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
查询,存储过程的调用:传入参数(IN)直接写需要传入的参数,传出参数(OUT)需要补全格式为 @变量名,如调用上述过程
#CALL 过程名(传入参数1,传入参数2,@传出变量),res名称自己取
CALL p_allot_user_coin(3,100,@res);
结果,输出结果 返回定义的修改状态_res值
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341