游标概念与实例

1.1游标的定义

引言

先不讲游标的如何概念,看如下Sql Server二零零六 图例:

图片 1

 

需求:两张表的O_ID是逐豆蔻年华对应的,未来求将加薪的薪水 原本的工资=今后的酬劳,也正是O_Salary=O_Salary A_Salary,改革表OriginSalary的薪金字段。

 

对于某些不熟习游标的程序猿来讲,这几个并非什么很难的主题材料,那么些主题材料用程序来完毕只怕也很简短。

自己先说说,用ASP.NET程序解决那一个难点的笔触:

  1. 先得到表OriginSalary的记录数,写个循环。
  2. 写SQL语句“select * from dbo.OriginSalary as A left join dbo.AddSalary as B on A.O_ID=B.O_ID”获得视图。
  3. 使用Dataset获得O_Salary=O_Salary A_Salary。
  4. 写UPDATE语句“update OriginSalary set O_Salary=”相加的值” where O_ID=”获得值”
  5. 循环3次,达成此效能。
    还应该有黄金年代种方法正是写存款和储蓄进度,在那间作者就不列出来了。

 

“难道数据库不可能风度翩翩行后生可畏行的拍卖数量吧?将表AddSalary的多少逐行的抽取,然后表 OriginSalary数据逐行的改善?”答案当然是迟早。那正是游标概念。

 

关于sql的批管理
批处理:[定义]从客商机传递到服务器上的黄金年代组完整的数据和SQL指令(能够是一条也足以包含多条sql指令卡塔尔国组成三个批管理。

  游标(Cursor)它使客商可逐行访谈由SQL Server重临的结果集。使用游标(cursor)的一个第黄金年代的因由就是把会集操作调换到单个记录处理格局。用SQL语言从数据库中寻觅数据后,结果放在内部存款和储蓄器的一块区域中,且结果往往是三个包罗多个记录的集纳。游标机制允许客商在SQL server内逐行地走访这几个记录,根据客户本身的愿望来显示和管理那几个记录。

1.1游标的定义

    游标(Cursor)它使客户可逐行访谈由SQL Server重返的结果集。使用游标(cursor)的一个关键的从头到尾的经过正是把集结操作调换来单个记录管理方式。用SQL语言从数据库中检索数据后,结果放在内部存款和储蓄器的一块区域中,且结果往往是叁个带有多少个记录的联谊。游标机制允许客户在SQL server内逐行地访谈这么些记录,根据客户本身的意思来显示和拍卖这一个记录。

 

(1卡塔 尔(英语:State of Qatar)八个批管理中借使存在少年老成处语法错误,整个批管理都没办法儿透过编译。
(2卡塔 尔(阿拉伯语:قطر‎批管理中能够分包四个存款和储蓄进程,但除第多少个存款和储蓄进程外剩下的蕴藏进度前边都必得使用Exec关键字。
(3卡塔 尔(英语:State of Qatar)有些特殊的SQL指令不可能和其余SQL指令共存在一个批管理中。如Create Table命令、Create View命令等,那一个指令只可以独自存在于一个单独的寄放进度中。
(4卡塔 尔(阿拉伯语:قطر‎全数的批管理命令使用GO作为完毕的标识。当编写翻译器读到GO的时候就把GO前面包车型地铁有着语句充任二个批管理,而打包成三个多少包发给服务器。
(5卡塔尔GO本人并非Transact-SQL的言语的组成都部队分,只是三个用来表示批管理实现的前端指令。

  1.2 游标的亮点

1.2 游标的优点

从游标定义能够赢得游标的如下优点,那一个亮点使游标在实际利用中发挥了要害功用:
  1卡塔尔国允许程序对由询问语句select重临的行集结中的每大器晚成行施行同生龙活虎或差别的操作,并不是对全部行集合实践同三个操作。
  2卡塔尔提供对依据游标地点的表中的行开展删减和翻新的力量。
  3卡塔尔游标实际上作为面向集结的数据库管理连串(PAJERODBMS卡塔 尔(英语:State of Qatar)和面向行的次第设计之间的大桥,使那三种管理方式通过游标沟通起来。

注意:
在有的意况下,假使sql指令中存在部分谬误,编写翻译的时候不只怕辨认而在施行的时候才会出错的话,那样在施行完后生可畏部分批管理操作后会爆发部分无效的排放物数据。那样咱们就需求引入三个能作保具有的SQL指令要么全体奉行成功,要么全部实践不成事。这几个便是“事务”!

  从游标定义能够博得游标的如下优点,那几个亮点使游标在骨子里行使中公布了首要意义:

1.3 游标的使用

 使用游标的相继: 声名游标、张开游标、读取数据、关闭游标、删除游标。

T_SQL游标
deallocate aa --释放游标

  1)允许程序对由询问语句select重临的行集结中的每大器晚成行实践同大器晚成或分裂的操作,实际不是对一切行聚积试行同多少个操作。

1.3.1 注解游标

最简便游标证明:

DECLARE <游标名>CURSOR FOR<SELECT语句>;
【注】select语句能够是简轻巧单询问,也足以是长短不一的连年询问和嵌套查询

【例】已表AddSalary
Declare mycursor cursor for select * from AddSalary
如此笔者就对表AddSalary表明了四个游标mycursor

 

【高级备注】

DECLARE <游标名> [INSENSITIVE] [SCROLL] CURSORFOR<SELECT语句>

[INSENSITIVE]
证明MS SQL SE奥迪Q7VELX570会将游标定义所筛选出来的数额记录贮存在风流潇洒权且表内(建设构造在tempdb 数据库下卡塔尔国。对该游标的读取操作皆由临时表来答复。由此,对基本表的更动并不影响游标提取的数量,即游标不会趁着基本表内容的修改而校勘,同期也力不胜任透过游标来更新基本表。要是不使用该保留字,那么对基本表的翻新、删除都会反映到游标中。
其余应该建议,当遭受以下情况发生时,游标将自动设定INSENSITIVE 选项。
a.在SELECT 语句中运用DISTINCT、 GROUP BY、 HAVING UNION 语句;
b.使用OUTER JOIN;
c.所接纳的猖狂表未有索引;
d.将实数值当做选用的列。

[SCROLL]
注解全体的提取操作(如FI凯雷德ST、 LAST、 P景逸SUVIO揽胜极光、 NEXT、 RELATIVE、 ABSOLUTE卡塔 尔(英语:State of Qatar)都可用。假如不使用该保留字,那么只好进行NEXT 提取操作。总体上看,SCROLL 十分的大地增添了领取数额的灵活性,能够轻便读取结果集中的任生龙活虎行数据记录,而无需关闭再
重开游标。

 

declare aa cursor --声雅培个游标
for
select UserID,UserName from  Test1 --为游标增加数据集

  2)提供对借助游标地方的表中的行开展删减和换代的力量。

1.3.2 张开游标

OPEN mycursor

for read only--设置只读属性

  3)游标实际上作为面向集合的数据库管理种类(KoleosDBMS)和面向行的次序设计之间的桥梁,使这两种管理情势通过游标调换起来。

 1.3.3 读取数据

FETCH [ NEXT | PRIOR | FIRST | LAST] FROM { 游标名  | @游标变量名 } [ INTO @变量名 [,…] ]
参数表达:
NEXT   取下风姿罗曼蒂克行的数量,并把下后生可畏行作为当下行(递增)。由于张开游标后,行指针是指向该游标第1行以前,所以率先次进行FETCH NEXT操作将获取游标集中的第1行数据。NEXT为默许的游标提取选项。
INTO @变量名[,…]  把提取操作的列数据放到局地变量中。列表中的各种变量从左到右与游标结果聚焦的呼应列相关联。各变量的数据类型必得与相应的结果列的数据类型相称或是结果列数据类型所扶助的隐性转换。变量的数量必需与游标选拔列表中的列的数目意气风发致。

 

当游标被展开时,行指针将针对该游标集第1行以前,即使要读取游标聚集的第1行数据,必需移动行指针使其指向性第1行。

就本例来说,能够动用下列操作读取第1行数据:
Eg: Fetch next from mycursor 或则 Fetch first from mycursor

 

将抽取的数量赋给变量:
//声明2个变量
declare @O_ID NVARCHAR(20)
declare @A_Salary float
//将抽取的值传入刚才申明的2个变量
Fetch next from mycursor into @ O_ID,@ A_Salary

open aa --展开游标

  1.3 游标的使用

1.3.4 关闭游标

CLOSE mycursor

 

--declare @aa int --声圣元(Synutra卡塔尔国个变量
--select @aa=@@cursor_Rows --将游标中数据行的数量赋给该变量
--select @aa

  讲了那个多游标的亮点,未来大家就亲自来揭秘游标的秘闻的面罩。

1.3.5 删除游标

DEALLOCATE mycursor

 

--close aa --关闭游标

  使用游标的顺序: 声名游标、打开游标、读取数据、关闭游标、删除游标。

1.3.6 实例

用游标抽出表2 AddSalary的数目。
为了运维创设的游标,将游标写在存款和储蓄进度里,方便我们看见游标的满贯使用进度。
在sqlserver二〇一〇中新建三个仓库储存过程:

 1 CREATE PROCEDURE PK_Test
 2 AS
 3 --声明2个变量
 4 declare @O_ID nvarchar(20) 
 5 declare @A_Salary float
 6 
 7 --声明一个游标mycursor,select语句中参数的个数必须要和从游标取出的变量名相同
 8 declare mycursor cursor for select O_ID,A_Salary from AddSalary
 9 
10 --打开游标
11 open mycursor
12 
13 --从游标里取出数据赋值到我们刚才声明的2个变量中
14 fetch next from mycursor into @O_ID,@A_Salary
15 
16 --判断游标的状态
17 --0 fetch语句成功 
18 -- -1 fetch语句失败或此行不在结果集中 
19 -- -2被提取的行不存在
20 while (@@fetch_status=0)
21 begin
22 
23 --显示出我们每次用游标取出的值
24 print '游标成功取出一条数据'
25 print @O_ID
26 print @A_Salary
27 
28 --用游标去取下一条记录
29 fetch next from mycursor into @O_ID,@A_Salary
30 end
31 --关闭游标
32 close mycursor
33 --撤销游标
34 deallocate mycursor
35 GO

这大家就运转那么些蕴藏进程,看看游标到底是怎么取值的:
大家开荒SQLSE凯雷德VEENCORE二零零六的询问剖析器,制定好数据库后,大家实施存款和储蓄进程
Exec PK_Test

效果与利益如下:

图片 2

 

近期我们写二个存储进程选择游标肃清引言中的难题:

CREATE PROCEDURE PK_SalaryAdd
AS
declare @O_ID nvarchar(20),@A_Salary float
declare mycursor cursor for select O_ID,A_Salary from AddSalary
open mycursor
fetch next from mycursor into @O_ID,@A_Salary
while(@@fetch_status = 0)
begin
Update OriginSalary set O_Salary=O_Salary @A_Salary where O_ID=@O_ID
fetch next from mycursor into @O_ID,@A_Salary
end
close mycursor
deallocate mycursor
GO 

奉行存款和储蓄进度
Exec PK_SalaryAdd

效果如下:

图片 3

实施存款和储蓄进度,看见大家影响了3行数据

  
用sql语句,看看表OriginSalary未来的结果:    

图片 4

 

 【轻易示例补充】

select * from dbo.bank

1 张三 10001
2 李四 10001
3 王五 10001
4 小儿 10001

declare @bankid int
declare @username varchar(50)
declare @rmbnum varchar(50)
declare cursor1 cursor for   --定义游标cursor1
select * from dbo.bank  ----使用游标的对象(跟据需要填入select表)
open cursor1      --打开游标
fetch next from cursor1 into @bankid ,@username,@rmbnum  --将游标向下移1行,获取的数据放入之前定义的变量@bankid ,@name,@rmbnum 中
while @@fetch_status=0           --判断是否成功获取数据
begin
update dbo.bank set rmbnum=@rmbnum 1
where bankid=@bankid                           --进行相应处理(跟据需要填入SQL文)
fetch next from cursor1 into @bankid ,@username,@rmbnum   --将游标向下移1行,获取的数据放入之前定义的变量@bankid ,@name,@rmbnum 中
end
close cursor1                   --关闭游标
deallocate cursor1   --删除游标与游标名称或游标变量之间的关联。

运维代码后

select * from dbo.bank

1 张三 10002
2 李四 10002
3 王五 10002
4 小儿 10002

 0 FETCH 语句成功
-1 FETCH 语句退步或此行不在结果聚集
-2 被提取的行不设有

 

 

fetch next from aa --获取下一行数据

  1.3.1宣称游标

while @@fetch_status=0 --判断获得状态
begin
 fetch next from aa --依次得到下生机勃勃行数据
end
close aa --关闭游标

  最简单易行游标申明:DECLARE <游标名>CUCRUISERSO奥迪Q5 FO讴歌RDX;

*********有关游标小说介绍*********

  此中select语句能够是简约询问,也足以是繁体的再而三询问和嵌套查询

运用游标(cursor)的三个关键的来由就是把会集操作转换到单个记录管理情势。用SQL语言从数据库中寻找数据后,结果放在内部存款和储蓄器的一块区域中,且结果往往是一个富含多少个记录的集结。游标机制允许客商在SQL server内逐行地拜访这几个记录,依据客商本人的心愿来浮现和管理这么些记录。

  例子:[已表2 AddSalary为例子]

1. 为什么选用游标:

  Declare mycursor cursor for select * from AddSalary 那样自个儿就对表AddSalary注明了一个游标mycursor

         使用游标(cursor)的二个首要的缘由正是把集结操作转换来单个记录管理方式。用SQL语言从数据库中寻找数据后,结果放在内部存款和储蓄器的一块区域中,且结果往往是一个含有三个记录的成团。游标机制允许顾客在SQL server内逐行地拜见这个记录,遵照客户自个儿的心愿来展现和管理这么些记录。

  【高等备注】

2. 什么样行使游标:

  DECLARE <游标名> [INSENSITIVE] [SCROLL] CU揽胜SOENCOREFOLX570这里本人说一下游标中级应用中的[INSENSITIVE]和[SCROLL]

     经常地,使用游标都遵照下列的不奇怪步骤:

  INSENSITIVE

      (1)  注明游标。把游标与T-SQL语句的结果集联系起来。
      (2)  张开游标。
      (3)  使用游标操作数据。
      (4)  关闭游标。

  声明MS SQL SE凯雷德VEHighlander会将游标定义所选抽取来的多少记录寄存在风度翩翩有的时候表内(创设在tempdb 数据库下)。对该游标的读取操作皆由一时表来应对。由此,对基本表的改善并不影响游标提取的数目,即游标不会随着基本表内容的改换而改动,同一时间也回天乏术通过游标来更新基本表。假若不应用该保留字,那么对基本表的立异、删除都会展现到游标中。

2.1. 评释游标

  其余应该提出,当蒙受以下情状时有发生时,游标将自动设定INSENSITIVE 选项。

DECLARE CUXC60SOCRUISER语句SQL-92规范语法格式:

  a.在SELECT 语句中央银行使DISTINCT、 GROUP BY、 HAVING UNION 语句;

DECLARE 游标名 [ INSENSITIVE ] [ SCROLL ] CURSOR

  b.使用OUTER JOIN;

FOR  sql-statement

  c.所选取的自便表未有索引;

Eg:

  d.将实数值充当选择的列。

Declare MycrsrVar Cursor

  SCROLL

FOR Select * FROM tbMyData

  申明全体的领取操作(如FI福特ExplorerST、 LAST、 P昂科威IOEscort、 NEXT、 RELATIVE、 ABSOLUTE)都可用。借使不选用该保留字,那么只可以举办NEXT 提取操作。综上所述,SCROLL 非常大地追加了领取数据的眼观处处,能够随便读取结果集中的任黄金年代行数据记录,而不用关闭再

2.2 展开游标

  重开游标。

OPEN MycrsrVar

  1.3.2 展开游标

当游标被打开时,行指针将本着该游标集第1行以前,假设要读取游标集中的第1行数据,必得移动行指针使其目的性第1行。就本例来讲,尚可下列操作读取第1行数据:

  特别轻松,大家就展开刚才我们注明的游标mycursor

     FETCH FIRST from E1cursor

  OPEN mycursor

     或 FETCH NEXT from E1cursor

  1.3.3读取数据

2.3      使用游标操作数据   

FETCH [ NEXT | PRIOR | FIRST | LAST] FROM { 游标名 | @游标变量名 } [ INTO @变量名 [,…] ]

下边包车型地铁亲自过问用@@FETCH_STATUS调节在一个WHILE循环中的游标活动

  参数表明:

/* 使用游标读取数据的操作如下。*/

  NEXT 取下大器晚成行的多少,并把下意气风发行作为当下行(依次增加)。由于展开游标后,行指针是指向该游标第1行早前,所以率先次施行FETCH NEXT操作将获取游标聚焦的第1行数据。NEXT为暗许的游标提取选项。

DECLARE E1cursor cursor      /* 评释游标,默以为FO卡宴WA奥德赛D_ONLY游标 */

  INTO @变量名[,…] 把提取操作的列数据放到局地变量中。列表中的各类变量从左到右与游标结果集中的应和列相关联。各变量的数据类型必需与相应的结果列的数据类型相称或是结果列数据类型所支撑的隐性转变。变量的数目必需与游标选取列表中的列的数码一致。

FOR SELECT * FROM c_example

  未来我们就抽出mycursor游标的数据吧!

OPEN E1cursor                /* 张开游标 */

  当游标被展开时,行指针将本着该游标集第1行在此以前,若是要读取游标聚集的第1行数据,必需移动行指针使其针对性第1行。就本例来讲,能够运用下列操作读取第1行数据:

FETCH NEXT from E1cursor     /* 读取第1行数据*/

  Eg: Fetch next from mycursor 或则 Fetch first from mycursor

WHILE @@FETCH_STATUS = 0     /* 用WHILE循环调控游标活动 */

  那样自身就抽出了游标里的数目,不过光光那样可远远不够,大家还索要将抽出的数码赋给变量

BEGIN

//声明2个变量 declare @O_ID NVARCHAR(20) declare @A_Salary float //将收取的值传入刚才宣称的2个变量 Fetch next from mycursor into @ O_ID,@ A_Salary 1.3.4关门游标

          FETCH NEXT from E1cursor   /* 在循环体内将读取别的行数据 */

   CLOSE mycursor

END

  1.3.5刨除游标

CLOSE E1cursor               /* 关闭游标 */

  DEALLOCATE mycursor

DEALLOCATE E1cursor          /* 删除游标 */

 

2.4     关闭游标

转载自:

     使用CLOSE语句关闭游标

CLOSE { { [ GLOBAL ] 游标名 } | 游标变量名 }

利用DEALLOCATE语句删除游标,其语法格式如下:

DEALLOCATE { { [ GLOBAL ] 游标名 } | @游标变量名

3. FETCH操作的明白语法如下:

 FETCH

           [ NEXT | PRIOR | FIRST | LAST]

FROM

{ 游标名 | @游标变量名 } [ INTO @变量名 [,…] ]

参数表达:

NEXT   取下黄金时代行的数额,并把下大器晚成行作为当下行(递增)。由于展开游标后,行指针是指向该游标第1行从前,所以率先次进行FETCH NEXT操作将得到游标集中的第1行数据。NEXT为暗许的游标提取选项。

INTO @变量名[,…] 把提取操作的列数据放到局地变量中。列表中的各种变量从左到右与游标结果集中的对应列相关联。各变量的数据类型必需与相应的结果列的数据类型相配或是结果列数据类型所支撑的隐性调换。变量的多少必需与游标选用列表中的列的多寡风姿罗曼蒂克致。


每实行三个FETCH操作之后,日常都要查看一下全局变量@@FETCH_STATUS中的状态值,以此判断FETCH操作是或不是中标。该变量有三种景况值:

· 0 表示成功试行FETCH语句。

· -1 代表FETCH语句失败,比如移动行指针使其当先了结果集。

· -2 表示被提取的行不设有。

由于@@FETCH_STATU是全局变量,在一个接连上的有所游标都恐怕影响该变量的值。因此,在实践一条FETCH语句后,必得在对另豆蔻梢头游标实践另朝气蓬勃FETCH 语句以前测验该变量的值能力作出科学的判定。

 

本文由星彩网app下载发布于星彩彩票app下载,转载请注明出处:游标概念与实例

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。