数据库游标允许你选择一组数据,通过翻阅这组数据记录(通常被称为数据集),检查每一个游标所在的特定的行。
游标的用法:
游标和局部变量组合在一起对每一个记录进行检查,当游标移动到下一个记录时来执行一些外部操作。
保存查询结果以备以后使用。通过执行 SELECT 查询来建立一个游标结果集,如果你的应用程序或过程需要重复使用一组记录, 那么第一次建立游标以后再重复使用将会比多次执行查询快得多。
1、创建游标
--创建游标
--使用Transact—SQL创建
declare cursor_name cursor
for select_statement
[for {read only | update [of column_name_list]}]
--使用 ORACLE7 的 SQL创建
DECLARE cursor_name CURSOR
FOR {SELECT command | statement_name | block_name}
游标有两个重要的部分:游标结果集和游标的位置。
例:创建一个基于ARTIST表的结果集:
create Artists_Cursor cursor
for select * from ARTISTS
go
2、打开游标
例:打开 ARTIST_Cursor 游标。
open ARTIST_Cursor
go
3、使用游标来进行翻阅
Transcat-SQL 提供了 FETCH 命令进行翻阅游标中的结果集。
fetch cursor_name [into fetch_target_list]
ORACLE SQL 则提供了:
FETCH cursor_name {INTO : host_variable
[[INDICATOR] : indicator_variable]
[, : host_variable
[[INDICATOR] : indicator_variable] ]...
| USING DESCRIPTOR descriptor }
每次当 FETCH 命令运行时,游标指针的在结果集中移动一行,移动到行的数据可以在 fetch_target_list 变量中进行修改。
将从 ARTIST_Cursor 的结果集中获得数据并把它返回给程序变量。
declare @name char(30)
declare @homebase char(40)
declare @style char(20)
declare @artist_id int
fetch Artists_Cursor into @name, @homebase, @style, @artist_id
print @name
print @homebase
print @style
print char(@artist_id)
go
4、测试游标的状态
Transcat-SQL中使用@@sqlstatus 和 @@rowcount检查当前的游标状态。
变量@@sqlstatus 返回最后一次运行 FETCH 语句的状态信息。
@@rowcount 则返回上次一 FETCH 命令设置的行号,可以用它来确定当前游标结果集的行数。
例:使用 While Loop 命令和变量@@sqlstatus 来翻阅当前的游标。
declare @name char(30)
declare @homebase char(40)
declare @artist_id int
fetch Artists_Cursor into @name, @homebase, @style, @artist_id
while (@@sqlstatus = 0)
begin
print @name
print @homebase
print @style
print char(@artist_id)
fetch Artists_Cursor into @name, @homebase, @style, @artist_id
end
go
5、关闭游标
使用:close cursor_name 这个游标依然存在。
关闭一个游标从本质上来说,是关闭了它的结果集,而并不是它的全部内容。
使用DEALLOCATE 命令将释放让游标所占用的内存。
deallocate cursor cursor_name
6、游标的适用范围
在会话中--会话在用户登录以后开始。如果用户在登录进行sql server以后创建一个游标,那么游标的名字将一直存在到用户退出登录,用户不能再一次使用在本次登录中创建的游标名。
在存贮过程--中游标在存贮过程的内部创建的好处在于只有当过程运行时它才真正起作用, 一旦过程退出了,则游标的名字将不再有效。
在触发机制--在触发机制中创建游标与在存贮过程中创建游标所受到的限制是相同的。
给出用 Transcat-SQL 写的创建、使用、关闭、释放一个游标的完整过程。
declare @name char(30)
declare @homebase char(40)
declare @style char(20)
declare @artist_id int
create Artists_Cursor cursor
for select * from ARTISTS
open Artists_Cursor
fetch Artists_Cursor into @name, @homebase, @style, @artist_id
while (@@sqlstatus = 0)
begin
print @name
print @homebase
print @style
print char(@artist_id)
fetch Artists_Cursor into @name, @homebase, @style, @artist_id
end
close Artists_Cursor
deallocate cursor Artists_Cursor
go