SQL 游标的应用
----------------SQL游标应用-----------------
if object_id('tempdb..#test0001') is not null drop table #test0001---------物料临时表
create table #test0001(ItemCode nvarchar(30)----物料代码
,SL DEC(19,3)----物料所需数量
,RowsID Bigint----用于循环物料
)
if object_id('tempdb..#test0002') is not null drop table #test0002---------容器临时表
create table #test0002(Carton nvarchar(30)----容器代码
,ItemCode nvarchar(30)----物料代码
,CSL nvarchar(30)----容器里物料数量
,RowsID Bigint ----用于循环容器,相同物料不同的容器进行排序
)
if object_id('tempdb..#test0003') is not null drop table #test0003---物料在各个容器中最终要的数量表
create table #test0003(ItemCode nvarchar(30)
,CarTon nvarchar(30)
,LastSL DEC(19,3)---在容器上所得数量
)
insert into #test0001(ItemCode,SL,RowsID)
values('A',5,1),('B',10,2)---添加物料A、B所需数量分别为5、10个,并给予物料排序
insert into #test0002(Carton,ItemCode,CSL,RowsID)
values('Q','A',3,1),('T','A',5,2),('Q','B',5,1) ,('T','B',3,2),('S','B',5,3)---给容器添加物料以及数量并给予物料所在不同容器排序
-----此时容器里的物料数为Q---A----3
-------------------------T---A----5
-------------------------Q---B----5
-------------------------T---B----3
-------------------------S---B----5
-----则此时A物料在Q中获取3个、在T中取2个
-----B物料在Q中取5个、在T中取3个、在S中取2个
declare @total_SL DEC(19,3)----临时物料总数量
declare @CT_SL DEC(19,3)----临时容器物料数量
declare @SL DEC(19,3)----临时物料数量
declare @test_cursor cursor------建立游标变量
declare @test_rowid bigint-------作为匹配游标变量
set @test_cursor = cursor for select RowsID from #test0001 ----设置游标绑定列
open @test_cursor--开启游标
fetch next from @test_cursor into @test_rowid--取第一个游标
while @@FETCH_STATUS = 0 ---一级循环
begin
--循环主体
select top 1
@total_SL = temp01.SL
from #test0001 temp01
where temp01.RowsID = @test_rowid
declare @test_cursor2 cursor
declare @test_rowid2 bigint
set @test_cursor2 = cursor for select temp02.RowsID --设置游标绑定列;此游标是在容器表中按相同物料不同容器进行排序的
from #test0002 temp02
inner join #test0001 temp01 on temp01.ItemCode=temp02.ItemCode
where temp01.RowsID=@test_rowid
--开启游标
open @test_cursor2
--取第一个游标
fetch next from @test_cursor2 into @test_rowid2
while @@FETCH_STATUS = 0 ------二级循环
begin
select top 1
@CT_SL = temp02.CSL
from #test0002 temp02
inner join #test0001 temp01 on temp01.ItemCode=temp02.ItemCode
where temp02.RowsID = @test_rowid2
and temp01.RowsID = @test_rowid
IF @CT_SL<@total_SL
begin -----若容器中存货量小于物料总数量则取完容器内数量
set @SL = @CT_SL
set @total_SL = @total_SL-@SL
end
else
begin
set @SL = @total_SL
set @total_SL = 0
end
-------------将循环每条记录插入#test0003表中-----------
insert into #test0003(ItemCode
,CarTon
,LastSL
)
select temp01.ItemCode
,temp02.Carton
,@SL
from #test0001 temp01
inner join #test0002 temp02 on temp02.ItemCode=temp01.ItemCode
where temp01.RowsID=@test_rowid
and temp02.RowsID=@test_rowid2
if @total_SL = 0 break;
--循环取游标下一个值
fetch next from @test_cursor2 into @test_rowid2
end
close @test_cursor2 --关闭二级游标
deallocate @test_cursor2 --关闭二级游标
--循环取游标下一个值
fetch next from @test_cursor into @test_rowid
end
close @test_cursor--关闭一级游标
deallocate @test_cursor--关闭一级游标
结果:
select * from #test0001;
select * from #test0002;
select * from #test0003;
SQL 游标的应用的更多相关文章
- sql 游标例子 根据一表的数据去筛选另一表的数据
sql 游标例子 根据一表的数据去筛选另一表的数据 DECLARE @MID nvarchar(20)DECLARE @UTime datetime DECLARE @TBL_Temp table( ...
- sql 游标循环当中重新赋值
sql 游标循环当中的变量必须重新赋值不然变量的值就是前次循环的值
- PL/SQL 游标 (实验七)
PL/SQL 游标 emp.dept 目标表结构及数据 要求 基于部门表建立游标dept_cursor1,使用记录变量接收游标数据,输出部门表信息: 显示格式: 部 门 号: XXX 部门名称: XX ...
- PL/SQL游标详解
刚打开游标的时候,是位于一个空行,要用fetch into 才能到第一行. 只是要注意用更新游标的时候,不能在游标期间commit. 否则会报ORA-01002: fetch out of seque ...
- 网上看到一份详细sql游标说明 《转载 https://www.cnblogs.com/xiongzaiqiren/p/sql-cursor.html》
SQL游标(cursor)详细说明及内部循环使用示例 游标 游标(cursor)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果.每个游标区都有一个名字,用户可以用SQL语句逐一从游标中获 ...
- Oracle PL/SQL游标
游标的提出: SQL是面向集合的,其结果一般是集合量(多条记录),而PL/SQL的变量一本是标量,其一组变量异常一直只能存放一条记录.所以仅仅使用变量并不能完全满足SQL语句向应用程序输出数据的要求. ...
- PL/SQL 游标
本随笔不是原创,只是学习笔记,用于加深记忆,原创地址PL/SQL --> 游标 一.游标的相关概念和特性 1.定义: 映射到结果集中的某一行的特定位置,类似与C语言中的指针.即通过游标方式定位到 ...
- Library Cache优化与SQL游标
Library Cache主要用于存放SQL游标,而SQL游标最大化共享是Library Cache优化的重要途径,可以使SQL运行开销最低.性能最优. 1 SQL语句与父游标及子游标 在PL/SQL ...
- SQL Server游标 C# DataTable.Select() 筛选数据 什么是SQL游标? SQL Server数据类型转换方法 LinQ是什么? SQL Server 分页方法汇总
SQL Server游标 转载自:http://www.cnblogs.com/knowledgesea/p/3699851.html. 什么是游标 结果集,结果集就是select查询之后返回的所 ...
随机推荐
- mysql常用语法
创建表 create table <表名>( <字段名> 类型(长度) not null primary key auto_increment, **主键 name char ...
- Web Service ,WCF以及Web API的对比
Web Service 1.基于SOAP和XML形式的返回数据. 2.只支出HTTP协议. 3.只能运行在IIS环境下. 4.不是开源的,但可以由任何支持xml的客户端下使用. WCF 1.基于SOA ...
- linux网卡配置
6.3网卡配置 DEVICE=eth0 TYPE=Ethernet BOOTPROTO=dhcp ONBOOT=yes NETMASK=255.255.255.0 GETWAY=192.168.1.2 ...
- iOS 注册密码加密 添加了时间戳 遇到的问题...
今天项目 遇到一个事故,我本想用 一个形容这个事故的adj 算了 既然 叫事故 已经能表达我们处于的一种状态, 是这样的: 有小部分用户反应 app无法注册 总提示密码错误的情况 实际 该步骤 已经 ...
- 在Windows平台搭建轻巧的Python开发环境——面向工程和科研的扩展包配置
首先,下载最新版本的Python. 为什么强调最新版本呢,因为新版本的漏洞通常会少得多,而且反映了未来的趋势. 既然要学,何不起点高一点? 官方下载地址:https://www.python.org/ ...
- Python 3 读写文件的简单方法!
Python 3 读写文件的简单方法! a = open('test.txt','w') 这行代码创建了一个名为test的文本文档,模式是写入(模式分为三种,w代表写入,r代表阅读,a代表在尾行添加) ...
- Troubleshooting OpenStack 瘫痪 - 每天5分钟玩转 OpenStack(160)
这是 OpenStack 实施经验分享系列的第 10 篇.是软件就会有 bug,OpenStack 也不例外,只要用它就一定会遇到故障.Troubleshooting(故障排除)是运维 OpenSta ...
- 寻找与疾病相关的SNP位点——R语言从SNPedia批量提取搜索数据
是单核苷酸多态性,人的基因是相似的,有些位点上存在差异,这种某个位点的核苷酸差异就做单核苷酸多态性,它影响着生物的性状,影响着对某些疾病的易感性.SNPedia是一个SNP调査百科,它引用各种已经发布 ...
- 关于Response.redirect和Response.End出现线程中止异常的处理
最近做了一个项目其中使用了多线程获取POST过来的数据后再Response回复,但由于是多线程,在Response.End()的时候报出了异常: 2013-10-20 10:05:31,606 res ...
- 常见的html面试题
1.doctype作用?标准模式和兼容模式各有什么区别? (1).<doctype>声明位于文档第一行,在<html>标签之前.用于告知浏览器的解析器以什么样的标准解析该文档. ...