1. 游标的定义
当应用程序从表中读取的记录大于1条时,需要用游标CURSOR(游标)来一次一条的处理这些记录。也就是说CURSOR用来处理存在表中符合条件的多条记录(类似COBOL程序循环的读文件)(就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。)
2. 游标的用法
一个游标按如下的操作顺序来处理数据:
- 定义游标:为游标指定一个名字和Select语句
- 打开游标:打开游标,生成结果集
- 使用游标读取数据:使用Fetch命令把结果集里的数据读取到宿主变量中,并可对游标指向的数据进行修改、删除等操作。
- 关闭游标:关闭游标,释放资源
3. 游标的操作详解
-
定义游标: 为游标指定一个名字和Select语句
-
基本格式:
EXEC SQL
DECLARE cursor-name CURSOR FOR
SELECT col-name1, col-name2
FROM table-name
Where search-condiction
(*FOR UPDATE OF* col-name2)
END-EXEC.
注意: 如果在读取的同时需要更新某些记录,必须要使用FOR UPDATE OF语句把需要更新的列名写出来,这样在打开游标时,DB2会在符合条件的记录上加更新锁,防止其他程序同时对源表进行更新造成数据错乱。
此外,在声明游标时,Select语句不能包含INTO子句。
-
打开游标: 打开游标,生成Select的结果集
-
基本格式:
EXEC SQL
OPEN cursor-name
END-EXEC.
注意: cursor-name必须是已经声明过的游标名字,程序可以通过检查SQLCODE来确定CURSOR打开成功
-
使用游标读取数据: 使用FETCH命令把结果集里的数据读取到宿主变量中,并可对游标指向的数据进行修改、删除等操作。
-
基本格式:
EXEC SQL
FETCH cursor-name
INTO: host-name1,
: host-nmae2
END-EXEC.
注意: (1)FETCH的游标名必须已经打开,INTO指定的宿主变量个数与类型必须与声明游标时指定的一致,并且必须要使用宿主变量接受数据;(2)FETCH类似COBOL程序的“读”文件操作,一般需要放在一个循环体中,一条一条的去读数据
宿主变量: 用来使应用程序和SQL语句进行数据交换。宿主变量可以通过DB2I生成,表里有几个列,就有几个宿主变量,一一对应;宿主变量也可以在COBOL程序的工作存储节自定义,但必须为指定的数据结构类型
-
使用游标更新数据:
-
基本格式:
EXEC SQL
UPDATE table-name
SET col-name = values
(*WHERE CURRENT OF* cursor-name)
END-EXEC.
注意: WHERE CURRENT OF cursor-name 表示更新游标指定的该条记录。
-
关闭游标: 处理结束之后,要关闭游标释放资源
-
基本格式:
EXEC SQL
CLOSE cursor-name
END-EXEC.
注意: 处理结束后一定要关闭游标