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值


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM