按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
好处
下边是创建 使用和关闭数据库游标的例子
1。 Create the cursor。
2。 Open the cursor for use within the procedure or application。
261
…………………………………………………………Page 262……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
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 pletely 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 mand | 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
262
…………………………………………………………Page 263……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
运行下列命令打开 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
263
…………………………………………………………Page 264……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
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 pletion 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
264
…………………………………………………………Page 265……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
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
265
…………………………………………………………Page 266……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
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
游标的适用范围
与表 索引以及其它的对象如触发机制和存贮过程不同 游标在创