游标的定义和使用
第三章 游标的定义和使用
3.1 游标的分类
前面介绍的SELECT语句只能处理返回一行数据的情况,当SELECT语句返回多个数据行时,必须使用游标。
游标是指向SELECT语句查询出的多行数据的指针,SELECT语句查询出的行组成一结果表,称为活动集。游标指向的行称为当前行。一般说来,游标分为三类:
(1)滚动游标
(2)非滚动游标
(3)更新游标
滚动游标是指程序可以根据需要指向活动集的某一行数据,即游标的位置可来回移动。非滚动游标是指活动集中的每行只能依次被读出。更新游标是非滚动游标,它的特点在于:数据库对游标指向的当前行加锁,当程序读下一行数据时,本行数据解锁,下一行数据加锁。锁加在数据库基本表对应的行上。
另外一种分类方法是将ESQL/C提供的游标分为两种类型,select游标和insert游标,select游标用于处理查询结果为多行数据的select语句;insert游标用于成块地往数据库中插入数据。
3.2 定义与使用游标的语句
定义和使用游标的语句以及与游标相关的语句有五个:
(1)DECLARE语句
这条语句用来定义游标,其一般形式是:
DECLARE 游标名 [SCROLL] CURSOR FOR SELECT语句
有关键字SCROLL的DECLARE语句定义的是滚动游标。SELECT语句可表为:
SELECT子句
[INTO子句]
FROM子句
[WHERE子句]
[GROUP BY子句]
[HAVING子句]
[ORDER BY子句]
[INTO TEMP子句]
DECLARE语句的作用是在数据库系统表中分配该游标资源,给游标一个自己的名字。游标名的作用范围是只要游标不被释放(FREE),在定义它的模块内有效。
(2)OPEN语句
在取得游标中的数据之前必须先执行OPEN语句来打开游标。OPEN语句的形式是:
OPEN游标名
OPEN语句的作用是,把SELECT语句送到SQL语句检查器中分析,决定活动集的内容,为SELECT语句的结果分配一块内存空间。对于打开滚动游标来说,还要建一个临时表。同时,OPEN语句把游标定位到活动集的第一行。
(3)FETCH语句
FETCH语句的一般形式:
FETCH [位置] 游标名 [INTO variable-list]
位置可以是这些关键字之一:NEXT,PREVIOUS,PRIOR,FIRST,LAST,CURRENT,RELATIVE n,ABSOLUTE n;FETCH中的INTO子句与SELECT语句中的INTO子句,二者必居其一。INTO关键字后跟宿主变量。
FETCH语句的作用是使游标定位到活动集的某行上。不管是否带有选择项,FETCH在完成游标的定位后,如果游标定位在活动集上,则把游标所在行的各列值分别赋给INTO子句中的各变量,如果游标定位在活动集以外,则把全局变量status的值置为NOTFOUND。游标定位在活动集第一行时执行FETCH PREVIOUS语句,或者,当游标定位在活动集最后一行时执行FETCH NEXT语句都会把游标定位到活动集以外。因此,使用FETCH语句时,经常要检查status的值是否等于NOTFOUND,以便进一步的操作。
(4)CLOSE语句
关闭游标,CLOSE语句的一般形式是:
CLOSE游标名
执行这条语句会释放OPEN语句分配的存储资源。需要再用该游标时,执行OPEN语句。
(5)FREE语句
FREE语句将把登记在系统表中的游标名删除,此后便不能再OPEN该游标了。
3.3 select游标
C语言中嵌入的单个select语句,只能处理查询结果恰好是一行数据的情况,当查询出多行数据时,ESQL/C就会报错。为此,ESQL/C提供了游标这一手段来处理这种情况。
查询语句select返回的多行数据称为活动集。ESQL/C程序中,一次只能处理活动集中的一行,这一行就叫做当前行。游标是指向当前行的一个指针。可见,游标是由活动集和一个指针来组成的。游标有两种状态,打开和关闭。当游标处于打开状态时,它指向活动集的位置有四种情况:(1)指向当前行;(2)指向两行之间;(3)指向第一行的前面;(4)指向最后一行的后面;当游标处于关闭状态时,它不再和活动集相关联。
使用select游标的步骤如下:
(1)将游标与select