zoukankan      html  css  js  c++  java
  • 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值

  • 相关阅读:
    JWT有这么难嘛?
    Mybatis一级缓存和二级缓存区别
    redis学习笔记
    基于Redission框架实现redis 分布式锁
    C# lambda 学习笔记
    C# 读取 ttf字体文件里的 Unicode
    网页调试控制台Preview乱码,但是正常显示
    uniapp 自定义组件 列表视图不更新问题
    asp.net core 允许跨域
    asp.net core asp-controller不生效
  • 原文地址:https://www.cnblogs.com/camg/p/12050185.html
Copyright © 2011-2022 走看看