
2.4 游标
不同于SQL查询单独执行时每次返回多个结果集,游标可以每次只返回一个结果,通过反复地对游标做FETCH操作,就可以获得多个查询结果。
游标的使用通常分为4个步骤:声明、打开、使用、关闭。
(1)声明:定义一个游标。
(2)打开:打开游标,实际上是开始为游标赋予初值。
(3)使用:通过MOVE等命令移动游标,并获得游标指向的内容。
(4)关闭:游标使用结束后,关闭游标。
2.4.1 声明游标
(1)声明没有绑定SQL语句的游标。具体语句如下:

(2)声明绑定具体执行的SQL语句的游标。具体语句如下:

(3)申明在指定SQL语句的同时指定需要绑定参数的游标。具体语句如下:

2.4.2 打开游标
如果游标在声明时没有绑定SQL语句,那么在打开游标时必须指定SQL查询语句。
例2-66:打开一个未绑定SQL语句的游标,同时指定SQL语句。具体语句如下:

对于未绑定SQL语句的游标,还可以通过format和USING指定动态命令。
例2-67:打开一个游标,通过format和USING操作指定绑定的SQL语句。具体语句如下:

如果已经绑定SQL语句,那么可以直接打开游标。
例2-68:对于已经绑定SQL的游标,可以直接打开,如果在绑定SQL语句时设置了参数,这里需要指定参数的值。具体语句如下:

2.4.3 使用游标
打开游标之后,就可以通过FETCH或MOVE等命令来操作游标指向的元组:
(1)FETCH:检索并返回游标所指向的行。
(2)MOVE:重新定义游标的位置,不返回数据。
例2-69:使用FETCH或MOVE命令检索数据。具体语句如下:

游标的移动方向是可以指定的,具体介绍如下:
(1)NEXT:返回当前游标指向的下一条元组,而且游标递增指向下一条元组。
(2)LAST:返回游标指向的结果集合中的最后一条元组,并且将最后一条元组作为当前元组。
(3)PRIOR:返回当前游标指向的上一条元组,并且游标递减指向上一条元组。
(4)FIRST:返回游标指向的结果集合中的第一条元组,并且将第一条元组指定为当前元组。
(5)ABSOLUTE count:读取游标指向的结果集合中的第count条元组,如果count为负数,那么返回从结果集合末尾向前的第count条元组。
(6)RELATIVE count:获取从当前元组开始的第count条元组。
(7)FORWARD:和PRIOR相同,返回当前游标指向的上一条元组。
(8)BACKWARD:和NEXT相同,返回当前游标指向的下一条元组。
2.4.4 关闭游标
关闭游标可以用CLOSE命令来实现。
例2-70:关闭游标cursor_sql。具体语句如下:
