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

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

我们微信上面由客户经理发放企业红包,需要粉丝们去抢,经理创建一个红包活动,没有被抢完的情况下,需要我们后面把红包剩余的钱返回给客户经理,首先我们判断所有需要返还的红包活动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了。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值