SQL Server 存儲過程之嵌套遊標


下面是一個訂單取消的含2個遊標的存儲過程spa

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.net

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

相關文章
相關標籤/搜索