[转载]T-SQL学习笔记-程序设计基础-游标

None.gif游标的引入
None.gif 1 .在数据的开发过程中,从某一结果集中逐一读取一条记录,用游标解决,游标占资源大,确定不用后将其释放。
None.gif 2 .声明游标(四个组成部分)
None.gif( 1 ).declare游标
None.gif( 2 ).open游标
None.gif( 3 ).从一个游标中fetch信息
None.gif( 4 ).close或deallocate游标
None.gif一、声明游标主要内容:
None.gif( 1 ).游标名字
None.gif( 2 ).数据来源表和列
None.gif( 3 ).选取条件
None.gif( 4 ).属性仅读或可修改
None.gif 1 .语法格式:
None.gif declare 游标名称 [ scroll ] cursor
None.gif[ local|global ]
None.gif[ forward_only|scroll ]
None.giffor 选择语句
None.gif [ for[read_only|update [of 字段名称1,字段名称2,dot.gif ] ]]
None.gif其中:
None.gif 1 > .local | global指定该游标的作用域是局部的还是全局的。
None.gif 2 > .如果把forward_only选择为forward_only, 则游标只能从第一行滚动到最后一行。
None.gif 3 > .scroll表明所有的提取操作,如first,last,prior, next ,relative,absolute都可用。如不使用该保留字,那么只能进行next提取操作。
None.gif 4 > .选择语句:是定义结果集的select语句,应该注意的是在游标中不能使用compute, compute by for browse into语句.
None.gif 5 > . read only :表明不允许游标内的数据被更新。
None.gif 6 > . update [ of 字段名1[,dot.gifn ] ]:定义在游标中可被修改的列。
None.gif
None.gif例1:标准游标
None.gif declare taihang cursor
None.giffor
None.gifselect id,name,address,city,state
None.gif from table
None.gif例2:只读游标
None.gif declare taihang cursor
None.giffor
None.gifselect id,name,address,city,atate
None.gif from table
None.giffor read only
None.gif例3:更新游标
None.gif declare taihang cursor
None.giffor
None.gifselect name,address
None.gif from table
None.giffor update
None.gif
None.gif二、打开游标
None.gif 1 .声明之后,如要从游标中读取数据,必须打开游标,使用open命令。
None.gif语法:
None.gif open  游标名称
None.gif注意:
None.gif 1 > .在打开游标时,如果游标声明语句中使用了insensitive保留字,则open产生一个临时表来存放结果集。如果在结果集中任何一行数据的大小超过SQL Server定义的最大行尺寸时,open命令将失败。
None.gif 2 > .insensitive:表明SQL Server会将游标定义所选取出来的数据记录存放在一临时表内,(建立在tempdb数据库下)对该游标的操作皆由临时表来应答。因此,对基本表的修改并不影响游标提取数据,即游标不会随着基本表内容的改变面改变,同时也不法通过游标来更新基本表。
None.gif
None.gif如果不使用该保留字,那么对基本表的更新,删除都会公映到游标中。
None.gif
None.gif三、读取游标中的数据- fetch
None.gif1 .当游标被成功打开以后就可以从游标中逐行地读取数据以时行相关处理。从游标中读取数据主要使用fetch命令。
None.gif语法:
None.gif fetch
None.gif[ [next|prior|first|last
None.gif|absolute{n|@nvar}
None.gif|relative{n|@nvar} ]
None.giffrom ] cursor_name
None.gif [ into @variable_name1,@variable_name2dot.gif ]
None.gif注:
None.gif 1 > . next :返回结果集中当前行的下一行,并增加当前行数为返回行行数。如果fetch next是第一次读取游标中数据,则返回结果集中的第一行而不是第二行。
None.gif 2 > .prior:返回结果集中当前行的前一行,并减少当前行数为返回行行数。如果fetch prior是第一次读取游标中的数据,刚无数据记录返回,并把游标位置设为第一行。
None.gif 3 > .first:返回游标中的第一行。
None.gif 4 > .last:返回游标中的最后一行。
None.gif 5 > .absolute{n | @nvar }:如果N或 @nvar为正数 ,则表示从游标中返回的数据行数。如果N或 @nvar为负数 ,则返回游标内从最后一行数据算起的第N或 @nvar行数据 。若N或 @nvar超过游标的数据子集范畴 ,则 @@fetch_status返回 - 1 。在该情况下,如果N或 @nvar为负数 ,则再执行fetch next命令会得到第一行数据;如果N或 @nvar为正值 ,如执行fetch prior命令刚会得到最后一行数据。N或 @nvar可以是固定值 ,也可以是smallint,tinyint或int类型的变量。
None.gif 6 > .relative{N | @nvar }:若N或 @nvar为正数 ,则读取游标当前位置起向后的第N或 @nvar行数据 。如果N或 @nvar为负数 ,则返回游标当前位置起向前的第N或 @nvar行数据 。若N或 @nvar超过游标的数据子集范畴 ,则 @@fetch_status返回 - 1 。在该情况下,如果N或 @nvar为负数 ,则再执行fetch next命令会得到第一行数据;如果N或 @nvar为正值 ,如执行fetch prior命令刚会得到最后一行数据。N或 @nvar可以是固定值 ,也可以是smallint,tinyint或int类型的变量。
None.gif 7 > . into @variable_name [ ,dot.gifn ] :允许使用fetch命令读取的数据存放在多个变量中;在变量行中的每个变量必须与游标结果集中相应的列相对应,每一变量的数据类型也要与游标中的数据列的数据类型相匹配。
None.gif
None.gif 2 .检查游标状态
None.gif @@fetch_status :全局变量,返回上次执行fetch命令的状态,在每次用fetch从游标中读取数据时,都应检查该变量以确定上次fetch操作是否成功,来决定如何进行下一步处理。 @@fetch_status变量有三个不同返回值
None.gif 1 > . 0 :表示成功取出了一行。
None.gif 2 > . - 1表示未取到数据。游标位置超出结果集。
None.gif 3 > . - 2表示返回的行已经不再是结果集的一个成员,这种情况只有在游标不是insensitive的情况下出现,即其它进程已删除了行或改变了游标打开的关键值。
None.gif
None.gif 3 .编辑当前游标行
None.gif通常,用游标来从基础表中检索数据,以实现对数据行处理,在修改游标中的数据,即进行定位更新或删除游标所包含的数据,所以必须执行另外的更新或删除命令,并在where子句中重新给定条件才能修改到该行数据,但是如果在声明游标时使用了for update语句那么就可以在update或delete命令中以where current of关键字直接修改或删除当前游标中所存储的数据,而不必使用where子句重新给出指定条件。当改变游标中数据时,这种变化会自动地影响到游标的基础表。但是如果在声明游标时选择了insensitive选项时,该游标中的数据不能被修改。
None.gif
None.gif进行定位修改或删除游标中的数据的语法规则语法:
None.gif update table_name
None.gif set column_name1 = {expression1 | null (select_statement)}
None.gif [ ,column_name2={expression2|null(select_statement)} ]
None.gifwhere current of cursor_name
None.gif
None.gif delete from table_name
None.gif where current of cursor_name
None.gif其中:
None.gif 1 > .table_name:是update或delete的表名。
None.gif 2 > .column_name:uqdate的列名
None.gif 3 > .cursor_name:游标名
None.gif
None.gif例1:首先声明一个游标
None.gif declare authors_cur scroll cursor
None.giffor
None.gifselect * from authors
None.gif for update of au_lname,au_fname
None.gif
None.gif更新authors表中的au_lname和au_fname列
None.gif update authors
None.gif set au_lname = ' china ' ,au_fname = ' asia '
None.gifwhere current of authors_cur
None.gif
None.gif删除authors表中的一行数据
None.gif delete from authors
None.gif where current of authors_cur
None.gif注:以上的更新或删除操作总是在游标的当前位置,
None.gif
None.gif例:下面是一个完整的定位更新的例子。
None.gif declare @au_id int ( 11 ), @au_lname varchar ( 40 ), @au_fname varchar ( 20 )
None.gif declare authors_cur cursor
None.giffor
None.gifselect au_id,au_lname,au_fname from authors
None.gif for update of au_id,aulname,au_fname
ExpandedBlockStart.gifContractedBlock.gif open authors_cur /* open then cursor */
None.giffetch next from authors_cer into @au_id , @au_lname , @au_fname
ExpandedBlockStart.gifContractedBlock.gifwhile @@fetch_status = 0 /* loop the rows in the cursor */
None.gifbegin
None.gif if @au_id = ' 172-32-1176 '
None.gif update authors
None.gif set au_lname = ' smith ' ,au_fname = ' jake '
None.gifwhere current of authors_cur
ExpandedBlockStart.gifContractedBlock.gif /* get next row */
None.giffetch next from authors_cer into @au_id , @au_lname , @au_fname
None.gifend
ExpandedBlockStart.gifContractedBlock.gifdeallocate authors_cur /* close the cursor */
None.gif
None.gif四、释放游标
None.gif 1 .关闭游标
None.gif使用close命令关闭游标,在处理完游标中数据之后,发布关闭游标来释放数据结果集和定位于数据记录上的锁,close语句关闭游标但不释放游标占用的数据结构。如果准备在随后的使用中再次打开游标,则应使用open命令。
None.gif语法: close 游标名称
None.gif 2 .释放游标
None.gif在使用游标时各种针对游标的操作或者引用游标各或者引用指向游标的游标变量,当close命令关闭游标时并没有释放游标占用的数据结构。因此常使用deallocate命令删除掉游标与游标名或游标变量之间的联系,并且释放游标占用的所有系统资源。
None.gif语法: deallocate 游标名称

[@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/443058/viewspace-926981/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/443058/viewspace-926981/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值