欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-07-04 22:46:16
1、需求,手动给会员新增京币,并且添加分配日志,返回修改是否成功 CREATE DEFINER=`jszapi`@`%` PROCEDURE `p_allot_user_coin`(IN `_member_id` int,IN `_coin` int,OUT `_res` tinyint) BEGI ......

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值

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