当我们需要用到 存储过程的时候,你会发现,有时候不仅仅是对数据的增删改查,经常需要对中间表的结果集进行操作,下面我先讲一下我这里的业务逻辑,然后再贴代码块,
我们微信上面由客户经理发放企业红包,需要粉丝们去抢,经理创建一个红包活动,没有被抢完的情况下,需要我们后面把红包剩余的钱返回给客户经理,首先我们判断所有需要返还的红包活动ID,然后根据每个活动ID去计算应该返还多少钱给客户经理。大概逻辑是就是这个样子,下面贴代码,代码也会有相应的注释。
--计算客户经理红包余额
create proc DealRedPaper
as
declare @redTotal decimal(20,6) --客户经理红包总金额
declare @redCount int --客户经理红包总数
declare @getTotal decimal(20,6) --粉丝一共领用的红包总金额
declare @getCount int --有多少粉丝领到了红包
declare @redId varchar(32) --活动ID
declare @redLeft decimal(20,6) --红包余额
declare @redMid varchar(32) --经理ID
--查询活动过期且active_flag=Y的数据
declare c_redPaper cursor FAST_FORWARD for
select 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,@redMid
WHILE @@FETCH_STATUS=0
begin
--根据活动ID查询领用情况
select @getCount=count(1),@getTotal=SUM(isnull(TOTAL,0)/100) from APP_SEND_RECORD where ACT_ID=@redId
--如果红包总个数大于领取的个数,则把剩余的钱退回给客户经理
if @redCount > @getCount
begin
set @redLeft=@redTotal-@getTotal --计算余额
update APP_SEND_PAPER_ACT set ACTIVE_FLAG='N' where ROW_ID=@redId --修改红包的状态为N
update APP_MANAGER set M_AMOUNT=M_AMOUNT+@redLeft where ROW_ID=@redMid --把剩余的钱返还给客户经理
end
--遍历下一条数据
FETCH NEXT FROM c_redPaper into @redId,@redTotal,@redCount,@redMid
end
CLOSE c_redPaper
DEALLOCATE c_redPaper
这样就OK了,剩下的是写一个JOB,每天结算一下红包活动就OK了。