SQLserver2008,存储过程,游标的使用。

来源:互联网 发布:淘宝店铺排行榜怎么看 编辑:程序博客网 时间:2024/05/01 06:25

当我们需要用到 存储过程的时候,你会发现,有时候不仅仅是对数据的增删改查,经常需要对中间表的结果集进行操作,下面我先讲一下我这里的业务逻辑,然后再贴代码块,

我们微信上面由客户经理发放企业红包,需要粉丝们去抢,经理创建一个红包活动,没有被抢完的情况下,需要我们后面把红包剩余的钱返回给客户经理,首先我们判断所有需要返还的红包活动ID,然后根据每个活动ID去计算应该返还多少钱给客户经理。大概逻辑是就是这个样子,下面贴代码,代码也会有相应的注释。

--计算客户经理红包余额create proc DealRedPaperasdeclare @redTotal decimal(20,6)  --客户经理红包总金额declare @redCount int  --客户经理红包总数declare @getTotal decimal(20,6)  --粉丝一共领用的红包总金额declare @getCount int   --有多少粉丝领到了红包declare @redId varchar(32)  --活动IDdeclare @redLeft decimal(20,6)  --红包余额declare @redMid varchar(32)  --经理ID--查询活动过期且active_flag=Y的数据declare c_redPaper cursor FAST_FORWARD forselect row_id,total,amount,mid from APP_SEND_PAPER_ACT where ACTIVE_FLAG='Y' and DELETE_FLAG='N' and GETDATE() > END_DATE


下面就需要用到游标了,遍历每一个红包活动,去计算每个红包活动还剩下多少钱。

--打开游标open c_redPaper--取第一条记录FETCH NEXT FROM c_redPaper into @redId,@redTotal,@redCount,@redMidWHILE @@FETCH_STATUS=0begin--根据活动ID查询领用情况select  @getCount=count(1),@getTotal=SUM(isnull(TOTAL,0)/100) from APP_SEND_RECORD where ACT_ID=@redId --如果红包总个数大于领取的个数,则把剩余的钱退回给客户经理if @redCount > @getCountbeginset @redLeft=@redTotal-@getTotal   --计算余额update APP_SEND_PAPER_ACT set ACTIVE_FLAG='N' where ROW_ID=@redId  --修改红包的状态为Nupdate APP_MANAGER set M_AMOUNT=M_AMOUNT+@redLeft where ROW_ID=@redMid  --把剩余的钱返还给客户经理end--遍历下一条数据FETCH NEXT FROM c_redPaper into @redId,@redTotal,@redCount,@redMidendCLOSE c_redPaperDEALLOCATE c_redPaper





这样就OK了,剩下的是写一个JOB,每天结算一下红包活动就OK了。

1 0
原创粉丝点击