游标
数据库指针类似于字处理程序中的指针当你按下方向键时游标依次从各行文本中
滚动按一下向上键游标向上跳一行而按PageUp 和PageDown 则会向一次翻阅几行数
据库游标的操作也类似
数据库游标允许你选择一组数据通过翻阅这组数据记录通常被称为数据集检查
每一个游标所在的特定的行你可以将游标和局部变量组合在一起对每一个记录进行检查
当游标移动到下一个记录时来执行一些外部操作
游标的另一个常见的用法是保存查询结果以备以后使用一个游标结果集是通过执行
SELECT 查询来建立的如果你的应用程序或过程需要重复使用一组记录那么第一次建
立游标以后再重复使用将会比多次执行查询快得多而且你还有在查询的结果集中翻阅的
好处
下边是创建使用和关闭数据库游标的例子
1. Create the cursor.
2. Open the cursor for use within the procedure or application.
SQL 21 日自学通(V1.0) 翻译人笨猪
262
3. Fetch a record's data one row at a time until you have reached the end of the cursor's records.
4. Close the cursor when you are finished with it.
5. Deallocate the cursor to completely discard it.
创建游标
如果使用Transcat-SQL 来创建游标其语法如下
SYNTAX
declare cursor_name cursor
for select_statement
[for {read only | update [of column_name_list]}]
使用ORACLE7 的SQL 来创建和语法格式则如下
SYNTAX
DECLARE cursor_name CURSOR
FOR {SELECT command | statement_name | block_name}
在执行DECLARE cursor_name CURSOR 语句时你必须同时定义将要在你的所有的
游标操作中使用的结果集一个游标有两个重要的部分游标结果集和游标的位置
下边的语句将创建一个基于ARTIST 表的结果集
INPUT
1> create Artists_Cursor cursor
2> for select * from ARTISTS
3> go
分析
你现在已经有了一个名字为ARTIST_Cursor 游标它包括了所有的ARTIST 表的内容
但是首先你必须打开游标
打开游标
最简单的打开游标命令如下
SYNTAX:
open cursor_name
SQL 21 日自学通(V1.0) 翻译人笨猪
263
运行下列命令打开ARTIST_Cursor 游标
1> open Artists_Cursor
2> go
现在你可以使用游标来翻阅结果集了
使用游标来进行翻阅
要想在游标结果集中进行翻阅操作Transcat-SQL 提供了FETCH 命令
SYNTAX
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 变量中
注Transcat-SQL 允许程序员通过下边的命令来实现一次移动多行
set cursor rows number for cursor_name
该命令不能使用INTO 子句但是当向前跳动的行数已知时用它来代替重复执行
FETCH 命令则很有用
下边的语句将从ARTIST_Cursor 的结果集中获得数据并把它返回给程序变量
INPUT
1> declare @name char(30)
2> declare @homebase char(40)
3> declare @style char(20)
4> declare @artist_id int
5> fetch Artists_Cursor into @name, @homebase, @style, @artist_id
6> print @name
SQL 21 日自学通(V1.0) 翻译人笨猪
264
7> print @homebase
8> print @style
9> print char(@artist_id)
10> go
你可以使用WHILE 循环来循环查看整个结果集但是你是如果知道已经到达了最后
一个记录的呢
测试游标的状态
Transcat-SQL 可以让你在任何时候通常维护@@sqlstatus 和@@rowcount 这两个全
局变量来检查当前游标的状态
变量@@sqlstatus 返回最后一次运行FETCH 语句的状态信息Transcat-SQL 规定除
了FETCH 命令以外其他的命令不得修改@@sqlstatus 变量该变量可以取下表三个值中
的一个下表是在Transcat-SQL 参考手册中给出的
Status Meaning
0 Successful completion of the FETCH statement.
1 The FETCH statement resulted in an error.
2 There is no more data in the result set.
而变量@@rowcount 则返回上次一FETCH 命令设置的行号你可以用它来确定当前
游标结果集的行数
下边的代码给出了FETCH 命令的扩充使用方法你现在可以使用While Loop 命令和
变量@@sqlstatus 来翻阅当前的游标
INPUT
1> declare @name char(30)
2> declare @homebase char(40)
3> declare @style char(20)
4> declare @artist_id int
5> fetch Artists_Cursor into @name, @homebase, @style, @artist_id
6> while (@@sqlstatus = 0)
7> begin
8> print @name
SQL 21 日自学通(V1.0) 翻译人笨猪
265
9> print @homebase
10> print @style
11> print char(@artist_id)
12> fetch Artists_Cursor into @name, @homebase, @style, @artist_id
13> end
14> go
分析
现在你已经有了一个全功能的游标下边要做的工作就是关闭游标
关闭游标
关闭游标是一个非常简单的工作它的语句如下
SYNTAX
close cursor_name
这时游标依然存在但是它必须被再次打开方可使用关闭一个游标从本质上来说
是关闭了它的结果集而并不是它的全部内容如果你已经完全结束了对一个游标的使用
的话DEALLOCATE 命令将释放让游标所占用的内存并且可以让游标的名字可以被再次
使用这是该命令的语法格式
SYNTAX
deallocate cursor cursor_name
例13.4 给出了用Transcat-SQL 写的创建使用关闭释放一个游标的完整过程
Example 13.4
INPUT
1> declare @name char(30)
2> declare @homebase char(40)
3> declare @style char(20)
4> declare @artist_id int
5> create Artists_Cursor cursor
6> for select * from ARTISTS
7> open Artists_Cursor
SQL 21 日自学通(V1.0) 翻译人笨猪
266
8> fetch Artists_Cursor into @name, @homebase, @style, @artist_id
9> while (@@sqlstatus = 0)
10> begin
11> print @name
12> print @homebase
13> print @style
14> print char(@artist_id)
15> fetch Artists_Cursor into @name, @homebase, @style, @artist_id
16> end
17> close Artists_Cursor
18> deallocate cursor Artists_Cursor
19> go
注下边是示例所用的数据
OUTPUT:
Soul Asylum Minneapolis Rock 1
Maurice Ravel France Classical 2
Dave Matthews Band Charlottesville Rock 3
Vince Gill Nashville Country 4
Oingo Boingo Los Angeles Pop 5
Crowded House New Zealand Pop 6
Mary Chapin-Carpenter Nashville Country 7
Edward MacDowell U.S.A. Classical 8