coverl 发表于 2016-11-6 09:57:03

SQL游标

有2个表,
表A

[*]ID      name      salary
[*]1         小张          2000
[*]2         小王          1800
[*]3         小刘          2200
[*]4         小赵          2100
[*]5         小李          3000

表B

[*]ID      bonus
[*]1         500
[*]2         480
[*]3         400
[*]4         600
[*]5         1000

表B与表A通过id相关联
    现在希望数据表A中的所有salary等于salary加上表B中的bonus列总的和是当前的总工资,并更新到表A。
      可以用视图来,表连接下就可以。
      现在想让SQL自己来处理,游标就是很好的方法

   原理:游标就是把数据按照指定要求提取查询出相应的数据集,然后再逐条对每一行数据进行处理。

1.1游标的概念
    游标(Cursor)它使用户可逐行访问由SQL Server返回的结果集。使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式。用SQL语言从数据库中检索数据后,结果放在内存的一块区域中,且结果往往是一个含有多个记录的集合。游标机制允许用户在SQL server内逐行地访问这些记录,按照用户自己的意愿来显示和处理这些记录。
1.2游标的优点
    从游标定义可以得到游标的如下优点,这些优点使游标在实际应用中发挥了重要作用:
      1)允许程序对由查询语句select返回的行集合中的每一行执行相同或不同的操作,而不是对整个行集合执行同一个操作。
      2)提供对基于游标位置的表中的行进行删除和更新的能力。
      3)游标实际上作为面向集合的数据库管理系统(RDBMS)和面向行的程序设计之间的桥梁,使这两种处理方式通过游标沟通起来。
1.3游标的使用
    使用游标的顺序: 声名游标、打开游标、读取数据、关闭游标、删除游标。

    1)、最简单游标声明:
       DECLARE <游标名> CURSOR FOR<SELECT语句>;
       其中select语句可以是简单查询,也可以是复杂的接连查询和嵌套查询
       如:

declare mycursor cursor for select * from tb_A

    2)、打开游标
       非常简单,我们就打开刚才我们声明的游标mycursor
      如:

OPEN mycursor      

    3)、读取数据
      FETCH [ NEXT | PRIOR | FIRST | LAST ] FROM { 游标名| @游标变量名 } [ INTO @变量名 [,…] ]
    参数说明:
      NEXT   取下一行的数据,并把下一行作为当前行(递增)。由于打开游标后,行指针是指向该游标第1行之前,所以第一次执行FETCH NEXT操作将取得游标集中的第1行数据。NEXT为默认的游标提取选项。
      INTO @变量名[,…]把提取操作的列数据放到局部变量中。
      列表中的各个变量从左到右与游标结果集中的相应列相关联。
      各变量的数据类型必须与相应的结果列的数据类型匹配或是结果列数据类型所支持的隐性转换。变量的数目必须与游标选择列表中的列的数目一致。

   4)、关闭游标

CLOSE mycursor
            
    5)、删除游标

DEALLOCATE mycursor

具体例子


declare @id int--定义变量来保存ID号
declare @Sfloat                  --定义变量来保存值
declare mycursor cursor for select * from tb_B   --为所获得的数据集指定游标
open mycursor                   --打开游标
fetch next from mycursorinto @id,@S   --开始获得第一条数据
while(@@fetch_status=0)   --如果数据集里一直有数据
begin
update tb_A setsalary = (tb_A.salary + @S) where tb_A.id = @id   
fetch next from mycursor into @id,@S   --跳到下一条数据
end
close mycursor      --关闭游标
deallocate mycursor--删除游标
页: [1]
查看完整版本: SQL游标