SQL Server 存储过程之嵌套游标


下面是一个订单取消的含2个游标的存储过程

复制代码
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go



ALTER PROCEDURE [dbo].[CancelOrderBySystem]
AS
BEGIN

declare    /*声明变量*/
@Status varchar(100),  --状态
@TimeNow datetime,   --当前时间
@TradeID varchar(50),  --订单单号
@GoodsID int,   --商品ID
@Num int,   --数量
@SkuID int  --规格ID

set @Status='TRADE_CLOSED_BY_SYSTEM'   /*为变量赋值*/
set @TimeNow=getdate()

 begin transaction; --开始执行事务
--查询所有已过期的订单
--对于已过期的订单查询其子订单,判断订单是否有规格
--如果没有规格的需先判断现在的是否有规格,有则不改总库存
--如果有规格的先判断该规格释放存在,存在才释放规格库存和总库存
--修改订单的状态

declare cancelOrder_Cursor cursor for  --声明游标
select TradeID from WxTrade where  Status='WAIT_BUYER_PAY' and OutTime<=@TimeNow 
OPEN cancelOrder_Cursor    --打开游标
FETCH NEXT FROM cancelOrder_Cursor    --获取游标的下一行数据
into @TradeID    --使变量获得当前游标指定行的订单单号

 ----------------------外部游标(主订单)begin --------------------------

WHILE (@@FETCH_STATUS = 0)    --FETCH语句执行成功
BEGIN
  --修改订单的状态
  update WxTrade set Status=@Status,CloseTime=@TimeNow where TradeID=@TradeID
  --修改总库存和规格库存,对于已过期的订单查询其子订单
  declare orderDetail_Cursor cursor for  --声明游标
  select GoodsID,SkuID,Num from WxOrder where  TradeID=@TradeID
  OPEN orderDetail_Cursor    --打开游标(子订单)
  FETCH NEXT FROM orderDetail_Cursor    --获取游标的下一行数据
  into @GoodsID,@SkuID,@Num   --使变量获得当前游标指定行的商品ID,规格ID,数量

  ----------------------内部嵌套游标(子订单)begin ----------------------
  ------------------------------------------------------------------------

  WHILE (@@FETCH_STATUS = 0)    --FETCH语句执行成功
  BEGIN
    if(@SkuID is null)
    BEGIN
      --没有规格的需先判断现在的是否有规格,有则不改总库存,没有则改
      if not exists(select SkuID from [Sku] where GoodsID=@GoodsID)
      BEGIN
       update Goods set Quantity=Quantity+@Num where GoodsID=@GoodsID
      END      
    END 
    else
    BEGIN
      --如果有规格的先判断该规格是否存在,存在才释放规格库存和总库存
      if exists(select SkuID from [Sku] where SkuID=@SkuID)
      BEGIN
       update [Sku] set ItemQuantity=ItemQuantity+@Num where SkuID=@SkuID
       update Goods set Quantity=Quantity+@Num where GoodsID=@GoodsID
      END 
    END 
   FETCH NEXT FROM orderDetail_Cursor     --获取游标的下一行(子订单)
   into @GoodsID,@SkuID,@Num   --使变量获得当前游标指定行的商品ID,规格ID,数量
  END
  CLOSE orderDetail_Cursor    --关闭游标(子订单)
  DEALLOCATE orderDetail_Cursor     --释放游标(子订单)

 ----------------------内部嵌套游标(子订单)end ----------------------
 ----------------------------------------------------------------------

 FETCH NEXT FROM cancelOrder_Cursor     --获取游标的下一行(主订单)
 into @TradeID    --使变量获得当前游标指定行的订单单号
End
CLOSE cancelOrder_Cursor    --关闭游标(主订单)
DEALLOCATE cancelOrder_Cursor    --释放游标(主订单)
 ----------------------外部游标(主订单)end --------------------------


if(@@error>0)
 begin
    rollback transaction
    return 0
 end
else    
 begin
    commit transaction
    return 1
 end


END
复制代码


参考:http://blog.csdn.net/gxiangzi/article/details/6774786#0-qzone-1-7441-d020d2d2a4e8d1a374a433f596ad1440

http://blog.csdn.net/superhoy/article/details/7663542#0-qzone-1-15425-d020d2d2a4e8d1a374a433f596ad1440

posted @   hellocjr  阅读(6930)  评论(1编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示