姚曦
(福建卫生职业技术学院公共基础部,福建 福州 350101)
在数据库的使用中,常常会遇到这种情况:用查询语句,得到一个结果集,但对这个结果的操作不是相同的,需要根据不同的条件,对不同的记录进行不同的处理。此时,就需要用到游标。
游标实际上是一种能从包括多条记录的结果集中每次提取一条记录的机制。游标总是与一条SQL查询语句相关联,允许应用程序对SELECT语句返回的行结果集中每一行进行相同或不同的操作,而不是一次对整个结果集进行同一种操作。这种特性使得对数据的操纵十分灵活。
SQL支持三种类型的游标:Transact-SQL游标、API游标和客户游标。
Transact-SQL游标:T-SQL游标是由DECLARE CURSOR语句定义,主要用在脚本、存储过程和触发器中,应用在服务器上。
API游标:API游标使用在客户端与服务器端的连接程序中(如OLE DB和ODBC等)。
客户游标:客户游标主要在当需要在客户机上缓存结果集时使用。
游标的操作可分为以下几个步骤:
声明游标的语法为:
DECLARE<游标名>[INSENSITIVE][SCROLL]CURSOR
FOR<SELECT语句>
[FOR{READ ONLY|UPDATE][OF<列名>[,…n]]}]
INSENSITIVE关键字:将取出的数据记录放在一个临时表内,对游标的读取操作由临时表来应答。游标不会随着基表内容的改变而改变,同时也无法通过游标来更新基本表。
SCROLL关键字:表明所有的提取操作(FIRST,LAST,PRIOR,NEXT,RELATIVE,ABSOLUTE)等都可用,如不使用该保留字,只能进行NEXT操作。
READ ONLY关键字:只读游标。
UPDATE关键字:可修改的游标,或指定修改的列。
声明游标后,如果要从游标中读取数据,必须打开游标。
打开游标的语法为:
OPEN[GLOBAL]<游标名>│<游标变量>
在游标成功打开后,全局变量@@CURSOR_ROWS将用来记录游标内数据行数。变量返回值代表的状态如表1所示。
表1 @@CURSOR_ROWS变量的返回值
当游标成功打开以后,可以使用FETCH语句从中读取数据。
{{GLOBAL<游标名>}│<@游标变量>}
[INTO@<变量名>[,…n]]
NEXT│PRIOR│FIRST│LAST:用于说明读取数据的位置。
ABSOLUTE、RELATIVE:给出读取数据的位置与游标头或当前位置的关系。其中N必须为整型常量或变量。
其中全局变量@@FETCH_STATUS返回上次执行FETCH命令的状态。在每次用FETCH从游标中读取数据时,都应检查该变量,以确定上次FETCH操作是否成功,来决定如何进行下一步处理。变量的返回值的状态如表2所示。
表2 @@FETCH_STATUS的返回值
CLOSE[GLOBAL]<游标名>|@<游标变量>
游标关闭后,其定义仍在,需要时可用OPEN语句打开,再次使用。若确认游标不再需要,就要释放其定义占用的系统空间,即删除游标。
DEALLOCATE[GLOBAL]<游标名>|@<游标变量>
案例说明:数据库company中有两张表。Salary显示的是全体员工的工资表,工作一段时间后,公司将按照员工的工作情况给员工加工资,每个员工加的工资不一样多,有的员工工资有调整,有的员工工资无调整。工资调整表为addincome。这种不是统一变动的情况,使用游标就非常灵活便捷。
游标使用的具体代码如下:
select*from salary
declare@id char(10),@salary int
declare sa_cur1 cursor
以上代码说明:首先基于salary表生成一个更新游标的结果集。从中逐条读取id参数,将id参数存放在@id变量中。使用@id变量在addincome表中查询是否有此@id员工,如果有此@id就表明,此@id的工资有调整,使用更新游标将调整的工资更新到salary表。如果无此@id就说明此@id的工资无调整,回到游标结果集中读取下一条记录。
本文介绍了SQL数据库中游标的概念,阐述了游标的类型及游标的使用步骤。最后通过一个更新工资表的实例说明游标的使用方法。
[1]李丹.SQL Server2005数据库管理与开发实用教程[M].北京:机械工业出版社,2010.
[2]申时凯,戴祖诚,佘玉梅.数据库原理与技术[M].北京:清华大学出版社,2010.