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
SQL Server 存储过程之嵌套游标的更多相关文章
- Sql server存储过程中常见游标循环用法
用游标,和WHILE可以遍历您的查询中的每一条记录并将要求的字段传给变量进行相应的处理 DECLARE ), ), @A3 INT DECLARE YOUCURNAME CURSOR FOR SELE ...
- sql server 存储过程使用游标记录
sql server 存储过程使用游标记录--方便下次参考使用 游标的组成: 声明游标 打卡游标 从一个游标中查找信息 关闭游标 释放游标 游标类型: 静态游标 动态游标 只进游标 键集驱动游标 静态 ...
- SQL Server存储过程Return、output参数及使用技巧
SQL Server目前正日益成为WindowNT操作系统上面最为重要的一种数据库管理系统,随着 SQL Server2000的推出,微软的这种数据库服务系统真正地实现了在WindowsNT/2000 ...
- sql server 存储过程 output 和return的使用 方法,详解
SQL Server目前正日益成为WindowNT操作系统上面最为重要的一种数据库管理系统,随着 SQL Server2000的推出,微软的这种数据库服务系统真正地实现了在WindowsNT/2000 ...
- SQL Server 存储过程(转载)
SQL Server 存储过程 Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这 ...
- (摘录)SQL Server 存储过程
文章摘录:http://www.cnblogs.com/hoojo/archive/2011/07/19/2110862.html SQL Server 存储过程 Transact-SQL中的存储过程 ...
- SQL Server 存储过程具体解释
SQL Server 存储过程具体解释 存储过程的优缺点 ◆长处: 运行速度更快. 存储过程仅仅在创造时进行编译,而一般SQL语句每运行一次就编译一次,所以使用存储过程运行速度更快. 存储过程用于处理 ...
- [转帖]SQL Server 10分钟理解游标
SQL Server 10分钟理解游标 https://www.cnblogs.com/VicLiu/p/11671776.html 概述 游标是邪恶的! 在关系数据库中,我们对于查询的思考是面向集合 ...
- Sql Server系列:嵌套查询
嵌套查询是指一个查询语句嵌套在另一个查询语句内部的查询.嵌套查询也就子查询,在SELECT子句中先计算子查询,子查询结果作为外层另一个查询的过滤条件,查询可以基于一个表或多个表.子查询中可以使用比较运 ...
随机推荐
- rz、sz (上传下载)命令参数的解释
$ man rz,查看帮助: -a, –ascii -b, –binary 用binary的方式上传下载,不解释字符为 ascii -e, –escape 强制escape 所有控制字符,比如 Ctr ...
- windows版 nginx配置反向代理实例教程 跳转tomcat和php网站
抄自 https://www.cnblogs.com/j-star/p/8785334.html 个人理解 nginx端口设置为80,简称n tomcat端口设置为其他,例如8080,简称t php网 ...
- 表单提交数据格式form data
前言: 最近遇到的最多的问题就是表单提交数据格式问题了. 常见的三种表单提交数据格式,分别举例说明:(项目是vue的框架) 1.application/x-www-form-urlencoded 提交 ...
- es6三点运算符的用法
扩展运算符( spread )是三个点(...).它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列. console.log(...[1,2,3]); console.log(1,. ...
- [TypeScript] Distinguishing between types of Strings in TypeScript
In JavaScript, many libraries use string arguments to change behavior. In this lesson we learn how T ...
- 26、从零写UVC驱动之分析描述符
指令:lsusb 可以查看usb设备的描述符信息,当然lsusb指令要带一些参数 一个usb设备有多个config配置+设备描述符,一个config有多个接口和association.config描述 ...
- 19、opencv和v4l2的关系
分析如下: v4L2是针对uvc免驱usb设备的编程框架,而opencv是一种跨平台计算机视觉库,opencv不仅支持v4l2框架,还支持windows.os等操作系统上的摄像头框架 cvCreate ...
- word中公式的排版及标题列表
1.首先建好你的标题,如标题1,标题2等等,你能够依次改变它们的字体,段落等格式,新建格式例如以下图所看到的 红圈处即建立新的格式,你能够建立不论什么你想要的格式,非常方便: 2.当你建立好了多个标题 ...
- fastjson排序 Map多层嵌套转换自动排序问题终极解决方案
阅读更多 最近项目中用到了fastjson(1.2.15)需要将前端多层嵌套json转换为map,由于map的无序性,想了很多办法,最终找到使用 Map m= JSONArray.parseObjec ...
- COCOS学习笔记--单点触控
这篇博客来总结下cocos单点触控的相关内容: 我们在Layer类的源代码中能够看到.Layer类提供了一下4个与屏幕单点触控相关的回调方法: onTouchBegan().onTouchMoved( ...