下面是一個訂單取消的含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