下面是一个订单取消的含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

SQL Server 存储过程之嵌套游标的更多相关文章

  1. Sql server存储过程中常见游标循环用法

    用游标,和WHILE可以遍历您的查询中的每一条记录并将要求的字段传给变量进行相应的处理 DECLARE ), ), @A3 INT DECLARE YOUCURNAME CURSOR FOR SELE ...

  2. sql server 存储过程使用游标记录

    sql server 存储过程使用游标记录--方便下次参考使用 游标的组成: 声明游标 打卡游标 从一个游标中查找信息 关闭游标 释放游标 游标类型: 静态游标 动态游标 只进游标 键集驱动游标 静态 ...

  3. SQL Server存储过程Return、output参数及使用技巧

    SQL Server目前正日益成为WindowNT操作系统上面最为重要的一种数据库管理系统,随着 SQL Server2000的推出,微软的这种数据库服务系统真正地实现了在WindowsNT/2000 ...

  4. sql server 存储过程 output 和return的使用 方法,详解

    SQL Server目前正日益成为WindowNT操作系统上面最为重要的一种数据库管理系统,随着 SQL Server2000的推出,微软的这种数据库服务系统真正地实现了在WindowsNT/2000 ...

  5. SQL Server 存储过程(转载)

    SQL Server 存储过程 Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这 ...

  6. (摘录)SQL Server 存储过程

    文章摘录:http://www.cnblogs.com/hoojo/archive/2011/07/19/2110862.html SQL Server 存储过程 Transact-SQL中的存储过程 ...

  7. SQL Server 存储过程具体解释

    SQL Server 存储过程具体解释 存储过程的优缺点 ◆长处: 运行速度更快. 存储过程仅仅在创造时进行编译,而一般SQL语句每运行一次就编译一次,所以使用存储过程运行速度更快. 存储过程用于处理 ...

  8. [转帖]SQL Server 10分钟理解游标

    SQL Server 10分钟理解游标 https://www.cnblogs.com/VicLiu/p/11671776.html 概述 游标是邪恶的! 在关系数据库中,我们对于查询的思考是面向集合 ...

  9. Sql Server系列:嵌套查询

    嵌套查询是指一个查询语句嵌套在另一个查询语句内部的查询.嵌套查询也就子查询,在SELECT子句中先计算子查询,子查询结果作为外层另一个查询的过滤条件,查询可以基于一个表或多个表.子查询中可以使用比较运 ...

随机推荐

  1. javascript中的this指向问题总结

    this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象 1.函数执行的时候,首先看函数名前边是否有点 ‘·’,有的话点’ ...

  2. js里的表格数组某个key去重

    如Elemgnt的table绑定的数据要某个key是唯一的 var myarry = [ {name: 'liuyang',age :13}, {name:'jike',age:15}, {name: ...

  3. 卫星网络中使用TCP协议的劣势(所以才有TCP优化版用来卫星通信啊,比如TCP-Peach和ADolar)

    卫星网络中使用TCP协议的劣势 为了避免产生网络拥塞,原TCP协议综合采用了慢启动.拥塞避免.快速重传以及快速恢复等算法.但这些算法应用的前提是网络发生拥塞造成丢包,然而在误码率相对较高的卫星通信系统 ...

  4. POJ 2983 Is the Information Reliable? 依旧差分约束

    http://poj.org/problem?id=2983 题目大意: 星际大战开始了.你购买了情报,需要判断它的准确性.已知地方的根据地在由南向北排成一条直线.P A B X,表示A在B北面距离X ...

  5. Compmgmtlauncher.exe问题解决方法

    修改注册表:HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Manage\command   原来的默认键值为 ...

  6. PJSIP开源库详解

    PJSIP是一个包含了SIP.SDP.RTP.RTCP.STUN.ICE等协议实现的开源库.它把基于信令协议SIP的多媒体框架和NAT穿透功能整合成高层次.抽象的多媒体通信API,这套API能够很容易 ...

  7. S​D​I​与​A​S​I 接口具体解释介绍

    分量编码 在对彩色电视信号进行数字化处理和传输是.一种经常使用的方式是分别对其3个分量(Y,R-Y.B-Y)进行数字化编码.这就是分量分量编码.另外还有全信号编码,全信号编码是对彩色全电视信号直接进行 ...

  8. 从Set里面取出有序的记录

    Set里面的记录是无序的.假设想使用Set,然后又想里面的记录是有序的,就能够使用TreeSet.而不是HashSet.在使用TreeSet的时候,里面的元素必须是实现了Comparable接口的,T ...

  9. Pandoc —— 标记语言转换工具(中文乱码问题)

    今次毕业设计,来个逼格高的,用 latex 编写.谁曾想,学院首先要收一份 word 版的.辣么多的 latex 公式如何转呀. Pandoc 是由 John MacFarlane 开发的标记语言转换 ...

  10. php 图片加水印文字水印

    /*给图片加文字水印的方法*/ $dst_path = 'http://f4.topitme.com/4/15/11/1166351597fe111154l.jpg';//保证路径正确 $dst = ...