下面是一個訂單取消的含2個游標的存儲過程
set ANSI_NULLS ONset QUOTED_IDENTIFIER ONgoALTER PROCEDURE [dbo].[CancelOrderBySystem]ASBEGINdeclare /*聲明變量*/@Status varchar(100), --狀態@TimeNow datetime, --當前時間@TradeID varchar(50), --訂單單號@GoodsID int, --商品ID@Num int, --數量@SkuID int --規格IDset @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 --使變量獲得當前游標指定行的訂單單號EndCLOSE cancelOrder_Cursor --關閉游標(主訂單)DEALLOCATE cancelOrder_Cursor --釋放游標(主訂單) ----------------------外部游標(主訂單)end --------------------------if(@@error>0) begin rollback transaction return 0 endelse begin commit transaction return 1 endEND
參考: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
新聞熱點
疑難解答