SQL 游标的应用

时间:2022-10-21 13:22:37

----------------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;

SQL 游标的应用

select * from #test0002;

SQL 游标的应用

select * from #test0003;

SQL 游标的应用

总结:
SQL 的游标类似于C程序里的for循环,上面的例子相当于C程序中的冒泡排序,SQL游标适用于存储过程中一张表需要循环匹配另一张表时用游标比较方便。

SQL 游标的应用的更多相关文章

  1. sql 游标例子 根据一表的数据去筛选另一表的数据

    sql 游标例子 根据一表的数据去筛选另一表的数据 DECLARE @MID nvarchar(20)DECLARE @UTime datetime DECLARE @TBL_Temp table( ...

  2. sql 游标循环当中重新赋值

    sql 游标循环当中的变量必须重新赋值不然变量的值就是前次循环的值

  3. PL&sol;SQL 游标 &lpar;实验七&rpar;

    PL/SQL 游标 emp.dept 目标表结构及数据 要求 基于部门表建立游标dept_cursor1,使用记录变量接收游标数据,输出部门表信息: 显示格式: 部 门 号: XXX 部门名称: XX ...

  4. PL&sol;SQL游标详解

    刚打开游标的时候,是位于一个空行,要用fetch into 才能到第一行. 只是要注意用更新游标的时候,不能在游标期间commit. 否则会报ORA-01002: fetch out of seque ...

  5. 网上看到一份详细sql游标说明 《转载 https&colon;&sol;&sol;www&period;cnblogs&period;com&sol;xiongzaiqiren&sol;p&sol;sql-cursor&period;html》

     SQL游标(cursor)详细说明及内部循环使用示例 游标 游标(cursor)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果.每个游标区都有一个名字,用户可以用SQL语句逐一从游标中获 ...

  6. Oracle PL&sol;SQL游标

    游标的提出: SQL是面向集合的,其结果一般是集合量(多条记录),而PL/SQL的变量一本是标量,其一组变量异常一直只能存放一条记录.所以仅仅使用变量并不能完全满足SQL语句向应用程序输出数据的要求. ...

  7. PL&sol;SQL 游标

    本随笔不是原创,只是学习笔记,用于加深记忆,原创地址PL/SQL --> 游标 一.游标的相关概念和特性 1.定义: 映射到结果集中的某一行的特定位置,类似与C语言中的指针.即通过游标方式定位到 ...

  8. Library Cache优化与SQL游标

    Library Cache主要用于存放SQL游标,而SQL游标最大化共享是Library Cache优化的重要途径,可以使SQL运行开销最低.性能最优. 1 SQL语句与父游标及子游标 在PL/SQL ...

  9. SQL Server游标 C&num; DataTable&period;Select&lpar;&rpar; 筛选数据 什么是SQL游标&quest; SQL Server数据类型转换方法 LinQ是什么? SQL Server 分页方法汇总

    SQL Server游标   转载自:http://www.cnblogs.com/knowledgesea/p/3699851.html. 什么是游标 结果集,结果集就是select查询之后返回的所 ...

随机推荐

  1. 理解Java对象序列化

    http://www.blogjava.net/jiangshachina/archive/2012/02/13/369898.html 1. 什么是Java对象序列化 Java平台允许我们在内存中创 ...

  2. Windows Server 2008 R2 下配置证书服务器和HTTPS方式访问网站

    http://www.cnblogs.com/zhongweiv/archive/2013/01/07/https.html 配置环境 了解HTTPS 配置CA证书服务器 新建示例网站并发布在IIS ...

  3. python中实现定时器Timer

    实现定时器最简单的办法是就是循环中间嵌time.sleep(seconds), 这里我就不赘述了 # encoding: UTF-8 import threading #Timer(定时器)是Thre ...

  4. win7删除一些顽固的文件夹

    创建一个记事本,键入以下命令: DEL /F /A /Q \\?\%1 RD /S /Q \\?\%1 然后保存为bat文件,然后将要删除的文件或文件夹拖入bat的文件图标上,既可以强力删除一些无法删 ...

  5. JS 匿名函数 自执行

    其实就是将函数直接做为表达调用,使用括号包裹定义函数体,解析器将会以函数表达式的方式去调用定义函数. 常见格式:(function() { /* code */ })(); 解释:包围函数(funct ...

  6. 主机ping通虚拟机,虚拟机ping通主机解决方法(NAT模式)

    有时候需要用虚拟机和宿主机模拟做数据交互,ping不通是件很烦人的事,本文以net模式解决这一问题. 宿主机系统:window7 虚拟机系统:CentOs7 连接方式:NAT模式 主机ping通虚拟机 ...

  7. python基础(六)

    一.内置函数 # input()# type()# len()# print()# enumerate()# list()# dict()# tuple()# set()# str()# int()# ...

  8. ubuntu下定时任务的执行

    概述 linux系统由 cron (crond) 这个系统服务来控制例行性计划任务.Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的. 另外, 由于使用者自己也可以设置计划 ...

  9. 阿里云配置tomcat https

    阿里云申请免费的SSL证书和配置https,可参考该篇博文:https://blog.csdn.net/baidu_19473529/article/details/70037976 虽然有现成的,不 ...

  10. windows下升级node&amp&semi;npm

    一.升级npm npm install -g npm 二.升级node 1.查询node的安装目录 where node 2.在官网下载最新的安装包,直接覆盖安装即可. https://nodejs. ...