程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> 積分獲取和消費的存儲過程學習示例

積分獲取和消費的存儲過程學習示例

編輯:關於MYSQL數據庫

       這篇文章主要介紹了積分獲取和消費的存儲過程學習示例,這個只是學習一下存儲過程的使用方法,需要的朋友可以參考下

      1.GM_JF客戶賬戶積分表

      2. GM_JF_DETAIL客戶賬戶積分消費記錄

      3. GM_JF_ACTION _RULES積分動作規則表

      4.GM_JF_GOODS _RULES積分商品規則表

     

    -- ===============測試=======================================================

    /*

    declare @StatusCode int = 1;

    exec sp_GM_JF_AddScore 'admin','AN_JF_001_001',1,5,0,'',@StatusCode output

    print @StatusCode

    */

    -- ===========================================================================

    /*

    * 判斷是否重復獲取積分(首次完善個人資料,首次修改密碼等等不能重復獲取積分)

    * 判斷是根據 從GM_JF_DETAIL(詳情表)查詢周期內的數據條數與GM_JF_ACTION_RULES(動作規則表)內的周期重復次數對比

    * 如果大於等於周期重復次數,則為重復獲取積分

    * 接下來

    *     1.詳情表的數據入庫

    *     2.判斷總積分表是否存在對應客戶的總積分 沒有則插入一條新的,有 則讀取其數據,並更新

    *

    */

    ALTER PROCEDURE [dbo].[sp_GM_JF_AddScore]

    @ACCOUNT_ID     varchar(30),

    @JF_CategoryNumber varchar(15),

    @CARD_NUM     int,

    @HQ_JF_AMOUNT     int,

    @State     varchar(16),

    @USE_DESC     varchar(400),

     

    @StatusCode     int output     -- 狀態碼: 0:失敗 1:成功 2: 不能重復獲取

    AS

    BEGIN

    -- SET NOCOUNT ON added to prevent extra result sets from

    -- interfering with SELECT statements.

    SET NOCOUNT ON;

     

    declare 

    @repetitionsCycle     float=0,    --周期(天)

    @repetitionsCycle_second    int=0,--周期(秒)

    @repetitionsFrequency     int=0,    --一個周期內允許最大次數

    @realFrequency     int=0,     --實際周期

     

    @USE_DATE     datetime = GETDATE();

    --是否重復獲取積分

    select top(1) @repetitionsCycle=RepetitionsCycle,@repetitionsFrequency=RepetitionsFrequency from GM_JF_ACTION_RULES where AN_CategoryNumber=@JF_CategoryNumber;

     

    if(@repetitionsCycle<1)

    BEGIN

    set @repetitionsCycle_second = (@repetitionsCycle-1)*24*60*60;

    select @realFrequency=COUNT(1) from GM_JF_DETAIL where ACCOUNT_ID=@ACCOUNT_ID and JF_CategoryNumber=@JF_CategoryNumber and USE_DATE <= @USE_DATE and USE_DATE >= CONVERT(varchar(19),DATEADD(SECOND,-@repetitionsCycle_second,@USE_DATE),120)

    END

    ELSE

    BEGIN

    select @realFrequency=COUNT(1) from GM_JF_DETAIL where ACCOUNT_ID=@ACCOUNT_ID and JF_CategoryNumber=@JF_CategoryNumber and USE_DATE <= @USE_DATE and USE_DATE >= CONVERT(varchar(10),DATEADD(DAY,-(@repetitionsCycle-1),@USE_DATE),120)

    END    

     

    if(@realFrequency>=@repetitionsFrequency)    --實際周期大於周期次數

    begin

    set @StatusCode = 2;

    return 2;

    end

     

    declare @count int = 0;     --數據條數

    declare @temp_table table    --表變量

    (

    ACCOUNT_ID varchar(30),

    JF_AMOUNT decimal(16,2),

    TTL_JF_AMOUNT decimal(16,2),

    Last_Update_Time datetime,

    [Version] int

    );

     

    begin tran;

    --插入詳情

    insert into GM_JF_DETAIL

    (ACCOUNT_ID,JF_CategoryNumber,CARD_NUM,HQ_JF_AMOUNT,[State],USE_DESC)

    values

    (@ACCOUNT_ID,@JF_CategoryNumber,@CARD_NUM,@HQ_JF_AMOUNT,@State,@USE_DESC)

     

    --填充表變量

    insert into @temp_table select ACCOUNT_ID,JF_AMOUNT,TTL_JF_AMOUNT,Last_Update_Time,[Version] from GM_JF where ACCOUNT_ID=@ACCOUNT_ID

    select @count = count(1) from @temp_table;

    --判斷並更新總積分(0:添加 其他:修改)

    IF(@count=0)

    begin

    insert into GM_JF(ACCOUNT_ID,JF_AMOUNT,TTL_JF_AMOUNT)

    values

    (@ACCOUNT_ID,@HQ_JF_AMOUNT,@HQ_JF_AMOUNT)

    end

    else

    begin

    declare @JF_AMOUNT int,     --總積分

    @TTL_JF_AMOUNT int,    --可用積分

    @Version int;     --版本號

     

    select @JF_AMOUNT=JF_AMOUNT,@TTL_JF_AMOUNT=TTL_JF_AMOUNT,@Version=[Version] from @temp_table where ACCOUNT_ID=@ACCOUNT_ID;

     

    update GM_JF set JF_AMOUNT=(@JF_AMOUNT+@HQ_JF_AMOUNT),TTL_JF_AMOUNT=(@TTL_JF_AMOUNT+@HQ_JF_AMOUNT),Last_Update_Time=GETDATE(),[Version]=(@Version+1) where ACCOUNT_ID=@ACCOUNT_ID

    end

     

    Commit tran;

    set @StatusCode = 1;

     

    IF(@@ERROR<>0)

    BEGIN

    set @StatusCode = 0;

    ROLLBACK tran;

    END

    END

     

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved