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

时间: 2024-10-08 01:17:26

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

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

原文:Sql server存储过程中常见游标循环用法 用游标,和WHILE可以遍历您的查询中的每一条记录并将要求的字段传给变量进行相应的处理 DECLARE @A1 VARCHAR(10), @A2 VARCHAR(10), @A3 INT DECLARE YOUCURNAME CURSOR FOR SELECT A1,A2,A3 FROM YOUTABLENAME OPEN YOUCURNAME fetch next from youcurname into @a1,@a2,@a3 while

SQL Server存储过程的初步认知

什么是存储过程? 存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令.实际上存储过程就是能完成一定操作的一组SQL语句. 为什么要用存储过程? 1.  存储过程只在创造时候编译,以后每次执行存储过程都不需要再重新的编译,而一般的SQL语句每执行一次就需要编译一次,所以使用存储过程可提高数据库执行速度. 2.  当对数据库进行复杂操作时,可将此复杂操作用存储过程封装起来与数据库提供的事物处理结合在一起. 3.  存储过程可以重复的使用,降低开发人员的工作量,提高工作效率. 4.  安全

SQL Server 存储过程具体解释

SQL Server 存储过程具体解释 存储过程的优缺点 ◆长处: 运行速度更快. 存储过程仅仅在创造时进行编译,而一般SQL语句每运行一次就编译一次,所以使用存储过程运行速度更快. 存储过程用于处理复杂的操作时,程序的可读性更强.网络的负担更小. 使用存储过程封装事务性能更佳. 能有效的放注入,安全性更好. 可维护性高.在一些业务规则发生变化时.有时仅仅需调整存储过程就可以.而不用修改和重编辑程序. 更好的代码重用. ◆ 缺点: 存储过程将给server带来额外的压力. 存储过程多多时维护比較

SQL Server 存储过程(转载)

SQL Server 存储过程 Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这样就可以提高存储过程的性能. Ø 存储过程的概念 存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行. 存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数.输出参数.返回单个或多个结果集以及返回值. 由于存储

SQL Server 存储过程(转)

SQL Server 存储过程 Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这样就可以提高存储过程的性能. Ø 存储过程的概念 存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行. 存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数.输出参数.返回单个或多个结果集以及返回值. 由于存储

Sql Server 存储过程中查询数据无法使用 Union(All)

原文:Sql Server 存储过程中查询数据无法使用 Union(All) 微软Sql Server数据库中,书写存储过程时,关于查询数据,无法使用Union(All)关联多个查询. 1.先看一段正常的SQL语句,使用了Union(All)查询: SELECT ci.CustId --客户编号 , ci.CustNam --客户名称 , ci.ContactBy --联系人 , ci.Conacts --联系电话 , ci.Addr -- 联系地址 , ci.Notes --备注信息 , ai

简单的如何创建sql server存储过程

学习sql server数据库,sql server存储过程的建立方法是一定要知道的,下面将教您如何建立sql server存储过程,希望对您有所帮助. 在对象资源管理器中,连接到某个数据库引擎实例,再展开该实例. 展开“数据库”.sql server存储过程所属的数据库以及“可编程性”. 右键单击“存储过程”,再单击“新建存储过程”. 在“查询”菜单上,单击“指定模板参数的值”. 在“指定模板参数的值”对话框中,“值”列包含参数的建议值.接受这些值或将其替换为新值,再单击“确定”. 在查询编辑

sql server存储过程分页,行变列

CREATE PROCEDURE [dbo].[PROC_GetPriviousAndNextDetailContent]@Index varchar(20),--表主键@Table varchar(100),--从哪个表获取数据@Columns varchar(100),--需要获取哪些字段@OrderStr varchar(100),--排序字段及方式@Where1    varchar(100),--row_number中的初步过滤条件@Where2 varchar(100)--当前要查询

14、SQL Server 存储过程

SQL Server 存储过程 存储过程类似函数,可以重复使用.相对于函数,存储过程拥有更强大的功能和更高的灵活性. 存储过程中可以包含逻辑控制语句和数据操作语句,可以接受参数,输出参数,返回单个值或多个结果集. 存储过程带来的好处: 1.性能的提升 存储过程执行时,第一次会进行编译和优化.但批处理T-SQL语句每次执行都需要预编译和优化,所以没有存储过程快. 2.易于维护 存储过程创建后存储在数据库中,可以被程序多次调用执行.当需要修改存储过程时,对应用程序代码毫无影响. 3.安全性 应用程序