MySQL數據篇 (一)存儲過程實現簡單的數據修改及事務的使用

一、需求,手動給會員新增京幣,而且添加分配日誌,返回修改是否成功sql

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

二、查詢,存儲過程的調用:傳入參數(IN)直接寫須要傳入的參數,傳出參數(OUT)須要補全格式爲 @變量名,如調用上述過程api

#CALL 過程名(傳入參數1,傳入參數2,@傳出變量),res名稱本身取
CALL p_allot_user_coin(3,100,@res);

三、結果,輸出結果 返回定義的修改狀態_res值spa

相關文章
相關標籤/搜索