1. 游标的概念
游标是一种处理数据的方法,它提供了在查询结果集中向前或者向后浏览数据、处理结果、集中数据的能力。游标可以看成是一种指针,它既可以指向当前位置,也可以指向结果集中的任意位置,它允许用户对指定位置的数据进行处理。有了游标,用户就可以访问结果集中的任意一行数据,在将游标放置到某行之后,可以在该行或从该位置开始的行块上执行操作。
2. 定义及使用游标
游标可以看作是由一个查询结果集合组成的一个临时文件,下面介绍怎样建立和使用游标 。
1)声明游标
游标在使用之前必须先声明,可用 DECLARE CURSOR 语句声明游标,语法如下:
DECLARE < 游标名 > [ INSENSITIVE ][ SCROLL ] CURSOR
FOR <SELECT- 查询块>
[FOR{READ ONLY|UPDATE[OF<列名>[,<列名> … ]]}]
·INSENSITIVE: 用数据的临时副本来定义游标,所有对游标的请求都反映在这个临时表上,因此这时的游标实际上是不允许修改的。
·SCROLL: 可以用所有的方法来存取数据,允许删除和更新。
·FOR<SELECT- 查询块 > : 用 SELECT 查询块定义一个游标,游标的内容是SELECT 查询的结果。
·FOR READ ONLY 或 FOR UPDATE: 说明游标为只读的还是可修改的。
2)打开游标
使用 OPEN 语句的功能是打开游标,实际上就是执行相应的 SELECT 查询语句,将查询结果放到缓冲区中。这时游标处于活动状态,游标指针指向第一条记录。语法如下:
OPEN < 游标名 >
3)提取游标中数据
FETCH语句是从游标中提取特定的一行。它的语法结构如下:
FETCH
[ [ NEXT | PRIOR | FIRST | LAST | ABSOLUTE n | RELATIVE n ] FROM ]
< 游标名 >
[INTO:<主变量1>,<主变量2>…]
·NEXT: 说明如果是在 OPEN 后第一次执行 FETCH 命令,则返回结果集的第一 行,否则使游标的指针指向结果集的下一行,NEXT 是默认的选项。
·PRIOR、FIRST 、LAST 、ABSOLUTE n 、RELATIVE n 选项只有在定义游标时使用了SCROOL 选项才可以使用。
·PRIOR: 返回结果集当前行的前一行。
·FIRST: 返回结果集的第一行。
·LAST: 返回结果集的最后一行。
·ABSOLUTE n: 如果n是正数,则返回结果集的第n行;如果n是负数,则返回结果集倒数第n行,
·RELATIVE n: 如果n 是正数,则返回当前行后的第n行;如果n是负数,则返回当前行开始倒数的第 n 行。
·INTO: 该语句的功能是把取出游标的当前记录并送入到主变量,INTO后的主变量要与在DECLARE CURSOR中 SELECT 的字段相对应。
同时使游标指针指向根据 PRIOR、FIRST 、LAST 、ABSOLUTE n 、RELATIVE n 选项指向的某条记录。
4)关闭游标
使用CLOSE语句关闭游标,语法如下:
CIOSE <游标名>
5)释放游标
使用 DEALLOCATE 语句释放游标,语法如下:
DEALLOCATE < 游标名 >
CLOSE 语句只是关闭游标,需要时还可以重新打开,而DEALLOCATE 语句则要释放和删除与游标有关的所有数据结构和定义。
3. 使用游标修改和删除数据
使用游标不仅可以用来浏览查询结果,还可以用 UPDATE 语句修改游标对应的当前行或用 DELETE 语句删除对应的当前行。
(1)使用CURRENT 形式的 UPDATE 语句修改数据,这种形式的 UPDATE 语句是 根据游标的当前记录修改数据库表中的记录。语法如下:
UPDATE < 表 名 >
SET <列名>={<表达式> | NULL}
[ ,<列名>={<表达式> | NULL}]
WHERE CURRENT OF < 游标名 >
(2)使用CURRENT 形式的 DELETE 语句删 除数据,这种形式的 DELETE 语句是根据游标的当前记录删除数据库表中的记录。语法如下,
DELETE FROM < 表名 >
WHERE CURRENT OF < 游标名 >
由于UPDATE 、DELETE 语句都是面向集合的操作,所以可一次性修改或删除满足条件的所有记录。如果用户只想修改其中的一些记录,则必须借助于游标,用 CURRENT 形式的 DELETE、 UPDATE 语句来完成。
4. 使用游标的步骤
使用游标的工作流程如图1-34所示。
(1)声明游标。
(2)打开游标。
(3)从游标的结果集中读取数据。
(4)对游标中的数据进行逐行操作。
(5)关闭游标。
(6)释放游标。