浅析SQL数据库中游标及其应用
2014-04-29杨铭
杨铭
摘 要: 游标是SQL数据库中从数据记录结果集中提取记录的一种重要机制,其手段灵活,形式多样。本文介绍了游标的概念、分类、生命周期和使用游标应该注意的问题。
关键词: 游标 SQL数据库 教学应用
一、游标的概念
游标(cursor)是系统为用户专门开设的用来存放SQL语句执行结果的一个数据缓冲区。通常在数据库开发过程中要检索一条记录时,我们可以使用SELECT语句操作。可是,如果想从某个结果集中逐一的读取记录,使用SELECT语句则变得麻烦,此时利用游标可以轻松解决。游标其实可以理解为一个定义在特定数据集上的指针,可以控制这个指针遍历数据集,或者仅仅是指向特定的行。用户通过SQL语句从游标中逐一地得到记录,然后赋给主变量,再通过主语言进一步处理。
二、游标的分类
游标是指向SELECT语句查询出的多行数据的指针,SELECT语句查询出的行组成一结果表,称为活动集,游标指向的行称为当前行。一般说来一般说来,游标分为三类,即滚动游标、非滚动游标和更新游标。
1.滚动游标是游标的位置可来回移动,即程序可以依据实际需要指向活动集中某一条记录。
2.非滚动游标是指活动集中的每条记录不可被选择读取而只能被依次读取。
3.更新游标活动集中的记录只能被一次读取,其特点在于:数据库将游标当前指向的记录加锁,当程序读下一条记录时,本条记录解锁,下一条记录加锁,锁加在数据库基本表对应的行上。
三、游标的生命周期
在T-SQL中,游标的生命周期由五个部分组成,即定义游标(DECLARE)、打开游标(Open)、使用游标(FETCH)、关闭游标(CLOSE)和释放游标(DEALLOCATE)。具体实现步骤为:
1.定义游标
在T-SQL中,定义一个游标可以是非常简单的,也可以是相对复杂的,取决于游标的参数,而游标的参数设置取决于你对游标原理的了解程度。游标其实可以理解成一个定义在特定数据集上的指针,我们可以控制这个指针遍历数据集,或者仅仅是指向特定的行,所以游标是定义在以Select开始的数据集上的,T-SQL中的游标定义的格式如下:
DECLARE〈游标名〉[SCROLL]CURSOR FOR SELECT语句
有关键字SCROLL的DECLARE语句定义的是滚动游标。SELECT语句可表为:
SELECT子句
[INTO子句]
FROM子句
[WHERE子句]
[GROUP BY子句]
[HAVING子句]
[ORDER BY子句]
[INTO TEMP子句]
DECLARE语句的作用是在数据库系统表中分配该游标资源,给游标一个自己的名字。游标名的作用范围是只要游标不被释放(FREE),在定义它的模块内就有效。
2.打开游标
当定义完游标后,游标需要打开后使用,只有简单一行代码。注意,当全局游标和局部游标变量重名时,默认会打开局部变量游标。打开游标语句执行游标定义中的SELECT语句,查询结果存放在游标缓冲区中(当打开的是滚动游标时,还要建一个临时表)。当游标的访问位置没有指定时,默认将游标指针指向游标区中的第一条记录。查询结果的内容依据设置的查询语句和查询条件。打开游标的语句格式:
OPEN〈游标名〉
3.使用游标
游标的使用分为两部分:一部分是操作游标在数据集内的指向,另一部分是将游标所指向的行的部分或全部内容进行操作。代码如下:
FETCH[[NEXT|PRIOR|FIRST|LAST| ABSOLUTE n| RELATIVE n]
FROM]〈游标名〉
[INTO @变量1,@变量2,…]
4.关闭游标
在游标使用完之后,一定要记得关闭,关闭后游标区的数据不可再读,但可以使用OPEN语句再次打开后再使用该游标。代码如下:
CLOSE〈游标名〉
5.释放游标
当游标不再需要被使用后释放游标。代码如下:
DEALLOCATE〈游标名〉
四、游标的优化
1.用完之后一定要关闭和释放。
2.尽量不要在大量数据上定义游标。
3.尽量不要使用游标上更新数据。
4.尽量不要使用insensitive,static和keyset这些参数定义游标。
5.如果只对数据进行读取,当读取时只用到FETCH NEXT选项,则最好使用FORWARD_ONLY参数。
五、结语
在数据库中,游标提供了一种可以操作从表中已被检索出的数据结果集中记录的灵活机制,可以从多条数据记录的结果集中每次提取一条记录。尽管如此,但游标会一定程度地影响系统的性能,如使用游标会导致页锁与表锁的增加,以及网络通信量的增加等,所以更要正确使用游标,灵活应用游标。
参考文献:
[1]田耕.浅谈数据库游标及其应用[J].广东金融电脑,2000(03).
[2]林晓峰.SQL SER VER服务器游标应用方法与实例[J].成才,2000(07).
[3]陈芳勤.SQL Server 2000中游标的应用[J].中国科技信息,2008(13).