游标就是存储结果集,将从指定表中查询出符合条件的记录,组成了结果集,然后把它存到游标当中,如果要显示游标中的哪一条记录
游标(游动的标识) !!!!非常重要的知识点,比较难理解
!!!游标提供了对表中的数据检索的一种方式,一种灵活操作手段,只是检索表中数据的一种方式。
在操作的时候也可以把游标看做是一个数据库对象。就好像视图一样。
它也是依赖于T-sql语句来进行查询,把查询出来符合条件的记录,不是一下全部显示出来,可以一条记录一条记录的把它显示出来。
它每次只提取一条记录,每次只显示一条记录。
游标的分类: 1、静态游标(不检测数据行的变化)
2、动态游标(反映所有数据行的改变)
3、仅向前游标(不支持滚动)
4、键集游标(能反映修改,但不能准确反映插入、删除)
游标的优点:一、它允许定位在结果集的特定行,查询出一组普通的记录可以把游标定位在某一条 录上,因为它是一个指针。
二、从结果集的当前位置检索一行或多行。
三、是对结果集当前位置的行进行数据修改。
四、为由其它用户对显示在结果集中的数据库数据所做的更改提供互级别的可见性支持
五、提供脚本存储过程触发器中使用的用于访问结果集中数据的T-SQL语句
1. 创建游标
use LtsDatabase实验 \首先打开数据库
(游标/指针)
declare testCutsorA cursor for \创建游标testCutsorA,cursor for代表是一个游标,for是要存储到游标中的结果集。就是查询到符合条件的记录,
放在一起组成一个记录集,然后把它存储到游标testCutsorA (游标类似于一个变量) 里,用的时候可以从变量里一次提取一条记录。
select * from 网站职员表 \从网站职员表中查找出符合条件的记录,然后把它存储到游标里。
for read only \只读游标(标准游标的一种方式,去掉它,就成了一个标准游标)
for update \更新游标
declare testCutsorA cursor for select * from 网站职员表 \for后面是此游标使用的哪一个T-sql语句查询出来的结果集存储进testCutsorA来。
2.打开游标
open testCutsorA
3.使用游标
fetch next from testCutsorA \滚动的从testCutsorA游标中一条一条的记录往下查找。
游标定义格式
(指针的意思)
Declare 游标名 [Insensitive] Cursor !!!! 所有没有用中括号括起来的内容都是必填内容。
局部 全局 中括号括起来的内容就是可选内容。
[Local|Global]定义作用范围的,定义作用域的。
只进游标 来回跳转的游标
[Forward_only|Scroll]
[Static|Keyset|Dynamic|Fast_forward]静态游标、键集驱动游标
[Read Only|Scroll_Locks|Optimistic]
[Type_warning]
For SQL 语句
[For[Read Only|Update]] \定义只读游标和更新游标,如果其中任何一个都不用的话,
它就是一个标准的游标。
定义游标的三种形式:标准游标、只读游标、更新游标。
标准游标
1.创建游标
use LtsDatabase试验
declare testCursorB cursor sorcll for
select * from 网站职员表
2.打开游标
open testCursorB
3.使用游标
fetch next from testCursorB \滚动的从testCutsorA游标中一条一条的记录往下查找。
fetch first from testCursorB \跳转回第一条记录。
fetch first last testCursorB \跳转到最后一条记录
1.创建游标
(指针)(来回跳转的游标)
declare testCursorB cursor scroll for select * from 网站职员表 \定义一个标准游标,从网站职员表中查询记录组成结果集。
2.打开游标
open testCursorB
3.使用游标
fetch Absolute 3 from testCursorB \查询出第三条记录。
使用全局变量来检查,所查询的结果是否超出结果集所存储的记录... ...
第一步: print @@fetch_status
第二步:fetch Absolute 30 from testCursorB \查询不到结果,因为已超出结果集所存储的记录。
第三步:print @@fetch_status 结果为-1 \结果为-1则是所查询的记录已超出结果集所存储的记录。
结果为-2 \结果为-2则是所查询的记录根本不存在。
游标指针的相对定位
1.创建游标
use LtsDatabase试验
declare testCursorA cursor scroll for select * from 网站职员表
2.打开游标
open testCursorA
3.读取
( 绝对定位 )
绝对的
fetch absolute 6 from testCursorA \从testCursorA游标中绝对定位到第6条记录。
( 相对定位 )
相对的
fetch relative -2 from testCursorA \从testCursorA游标中的当前记录向前跳转两条记录
fetch relative 2 from testCursorA \从testCursorA游标中的当前记录向后跳转两条记录
把提取出来的记录存储到指定的变量当中
declare @testVar1 int,@testVar2 varchar(50),@testVar3 int,@testVar4 varchar(100),@testVar5 varchar (50),@testVar5 money \连续声明5个变量,声明这5个变量的顺序是与网站职员表的字段类型顺序相同的。
fetch absolute 2 from testCursorA into @testVar1,@testVar2,@testVar3,@testVar4,@testVar5,@testVar6 \如果跳转到结果集中的第二条记录,则把它提取出来把各个字段的值分别存储赋给这5个变量。
print '第一个字段的值为'+cast(@testvar1 as varchar(50)) \分别把一条记录中各个字段的值显示出来
print '第一个字段的值为'+@testvar2 \分别把一条记录中各个字段的值显示出来
print '第一个字段的值为'+cast(@testvar3 as varchar(50)) \分别把一条记录中各个字段的值显示出来
print '第一个字段的值为'+@testvar4 \分别把一条记录中各个字段的值显示出来
print '第一个字段的值为'+cast(@testvar5 as varchar(50)) \分别把一条记录中各个字段的值显示出来
也可以使用以下方式输出
select @testVar1 as 职员编号为,@testVar2 as 姓名,@testVar3 as 年龄,@testVar4 as 毕业院校,@testVar5 as 工资
如何关闭和释放游标
1.首先创建游标
use newlts
declare testCursorA cursor scroll for
select * from 网站职员表
2.打开游标
open testCursorA
3.读取游标中的记录 4.关闭游标 5.释放游标
fetch next from testCursorA close testCursorA deallocate testCursorA \释放游标之后游标就不存在了。