游标的使用

来源:互联网 发布:三国群英传3 mac版 编辑:程序博客网 时间:2024/06/07 05:06

1、概念

 游标(Cursor)它使用户可逐行访问由SQL Server返回的结果集。使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式。用SQL语言从数据库中检索数据后,结果放在内存的一块区域中,且结果往往是一个含有多个记录的集合。游标机制允许用户在SQL server内逐行地访问这些记录,按照用户自己的意愿来显示和处理这些记录

2、声明:

DECLARE <游标名> [insensitive] [scroll] CURSOR FOR<SELECT语句>

[FOR { READ ONLY  |  UPDATE | [ OF column_name [,....n] ] } ]

insensitive:该选项将游标数据的一个拷贝放入tempdb中,这样游标就看不到数据的变化,该选型有时也称为快照(snapshot)或静态游标(static cursor)。不允许直接跟新包含在该游标中的内容。MS SQL SERVER 会将游标定义所选取出来的数据记录存放在一临时表内(建立在tempdb 数据库下)。对该游标的读取操作皆由临时表来应答。因此,对基本表的修改并不影响游标提取的数据,即游标不会随着基本表内容的改变而改变,同时也无法通过游标来更新基本表。如果不使用该保留字,那么对基本表的更新、删除都会反映到游标中。

另外应该指出,当遇到以下情况发生时,游标将自动设定INSENSITIVE 选项。
a.在SELECT 语句中使用DISTINCT、 GROUP BY、 HAVING UNION 语句;
b.使用OUTER JOIN;
c.所选取的任意表没有索引;
d.将实数值当作选取的列。
scroll

表明所有的提取操作(如FIRST、 LAST、 PRIOR、 NEXT、 RELATIVE、 ABSOLUTE)都可用。如果不使用该保留字,那么只能进行NEXT 提取操作。由此可见,SCROLL 极大地增加了提取数据的灵活性,可以随意读取结果集中的任一行数据记录,而不必关闭再重开游标。 

FOR READ ONLY
指出游标是只读的。在默认情况下,包含在游标中的数据是可以更新的

FOR UPDATE

指游标是可以更新的

3、打开游标

OPEN 游标名

4、读取游标

FETCH [ next | prior |first | last ] FROM { 游标名  | @游标变量名 } [ INTO @变量名 [,…] ]
 
5、关闭游标
CLOSE mycursor   
         
6、删除游标
DEALLOCATE mycursor        
7、应用

if exists (select * from sysobjects where id=object_id(N'cursor_test_serch_tb_students') and OBJECTPROPERTY(id,N'isProcedure')=1)drop procedure cursor_test_serch_tb_studentsGO/*创建存储过程cursor_test_serch_tb_students,定义一个游标,从表students中按顺序读取数据*/create procedure cursor_test_serch_tb_students asdeclare @id int,@name varchar(20)declare student_to_cursor cursor for select st_id,st_name from studentsopen student_to_cursorfetch next from student_to_cursor into @id,@name/*判断游标的状态0 fetch语句成功     -1 fetch语句失败或此行不在结果集中     -2被提取的行不存在*/while(@@FETCH_STATUS=0)BEGINPRINT convert(varchar(5),@id)+':'+@namefetch next from student_to_cursor into @id,@nameENDclose student_to_cursordeallocate student_to_cursor
执行:

exec cursor_test_serch_tb_students

结果:

1:ZhangSan
2:Tom
3:Jack
4:Mis Daivid
5:Li Moss
6:Wang Liang
7:Zhang Qian
8:Qu HuaiYuan



原创粉丝点击