存储过程 游标的使用

Posted 勿忘初心

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了存储过程 游标的使用相关的知识,希望对你有一定的参考价值。

项目中有个需求领取的款项过期后自动释放,此处我用了游标来实现,上代码

USE [QHWCloud]
GO
/****** Object:  StoredProcedure [dbo].[pro_Shifang]    Script Date: 05/26/2017 15:04:47 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER   PROCEDURE  [dbo].[pro_Shifang] 
as
declare @id int;
declare @money decimal;
declare @miid int;
declare @SumMoney decimal;
declare @linShimoney decimal;
declare @Paymoney decimal;
DECLARE  CUR_GuoQi CURSOR scroll For --创建游标,查询过期数据
    select mr_id,mi_id,mi_receivermoney from t_money_receive t  where t.mi_endtime< GETDATE() and t.mi_state=1  ;
open CUR_GuoQi;  --打开游标
begin    
fetch first from CUR_GuoQi into @id,@miid,@money  --我理解为此处获取游标的第一行
While @@FETCH_STATUS=0   ---返回被 FETCH 语句执行的最后游标的状态,而不是任何当前被连接打开的游标的状态。
if(@id!=‘‘)
begin      
    update t_money_receive set  t_money_receive.mi_state=2 where t_money_receive.mr_id=@id; --将该条申请记录状态修改为2 ,释放
    
    set @linShimoney=(select t_money_info.mi_surplusmoney  from t_money_info where t_money_info.mi_id=@miid); --查询可用余额
    
    set @SumMoney=@linShimoney+@money; --重新计算可用余额
    
    set @Paymoney=(select pay_money  from t_money_info where t_money_info.mi_id=@miid) --查询款项的支付金额
    
    
    if(@Paymoney=@SumMoney) --释放后没有其他的领取申请 
     begin
       update t_money_info set t_money_info.mi_surplusmoney=@SumMoney , t_money_info.mi_state=1 where t_money_info.mi_id=@miid; --将领取金额返回到款项可用金额中,并且将状态修改为未领取
     end
     else
        update t_money_info set t_money_info.mi_surplusmoney=@SumMoney, t_money_info.mi_state=2 where t_money_info.mi_id=@miid; --将领取金额返回到款项可用金额中,并且将状态修改为部分领
fetch next from CUR_GuoQi into @id,@miid,@money   -----提前下一条 信息
  end
end
Close CUR_GuoQi;----关闭游标
deallocate CUR_GuoQi ------删除游标

 

以上是关于存储过程 游标的使用的主要内容,如果未能解决你的问题,请参考以下文章

oracle 存储过程执行动态SQL 返回结果给游标,外部程序获得dataset结果集。

在sql存储过程中循环并删除游标

mysql之——存储过程 + 游标 + 事务

MySQL 存储过程,获取使用游标查询的结果集

带游标的Mysql存储过程

关于存储过程返回游标的处理