在
Db2
中,应用程序使用光标指向从表中检索的一组行中的一个或多个行。 您还可以使用光标从存储过程返回的结果集中检索行。 您的应用程序可以使用光标从表中检索行。
您可以检索并处理满足 SQL 语句搜索条件的一组行。 当您使用程序选择行时,程序一次处理一行或多行。
SELECT语句必须位于DECLARE CURSOR语句中,且不能包含INTO子句。 DECLARE CURSOR 语句定义并命名游标,确定使用游标的 SELECT 语句检索的行集。 这组行被称为结果表。
DECLARE CURSOR 语句执行后,您可按如下方式处理游标的输出表:
在检索任何行之前,请打开光标。
要告诉
Db2
您已准备好处理结果表的第一行,请让您的程序发出OPEN语句。
Db2
然后在DECLARE CURSOR语句中使用SELECT语句来确定一组行。 如果您在SELECT语句中使用宿主变量,
Db2
将使用
变量的当前值
来选择行。
使用FETCH语句检索一行或多行。
FETCH语句的最简单形式是通过使用
行定位光标
来检索结果表中的一行。 在任何时间点,行定位光标最多只能从结果表中检索一行数据到宿主变量中。 您可以使用 FETCH 语句,通过启用处理行集的光标来检索结果表中的多行。
行集
是通过多行获取操作获取的一组行。
当您的程序发出行定位的FETCH语句时,
Db2
使用光标指向结果表中的某一行,使其成为当前行。
Db2
然后将当前行内容移动到您在FETCH语句的INTO子句中指定的程序主机变量中。 FETCH语句移动光标。 您可以使用宿主变量数组,并通过一个FETCH语句返回多行数据。
当出现数据结束条件时,关闭光标。
如果您处理完结果表的行,并希望再次使用光标,请发出CLOSE语句以关闭光标。
在DECLARE CURSOR语句中引用宿主变量之前,必须声明这些变量。 要定义和识别一组要使用游标访问的行,请发出DECLARE CURSOR语句。 DECLARE CURSOR 语句用于命名游标并指定 SELECT 语句。 SELECT语句定义了结果表中行所属的标准。
您可以使用游标来获取、更新或删除表格中的一行或多行,但不能使用游标向表格中插入一行。
示例
假设您的程序检查部门 D11 中的人员数据,并将数据保存在EMP表中。 以下示例展示了在COBOL程序中定义和使用游标的SQL语句。 在这些示例中,程序使用光标处理 EMP 表中的一组行。
-
示例:定义光标
-
以下语句定义了一个名为THISEMP的游标:
EXEC SQL
DECLARE THISEMP CURSOR FOR
SELECT EMPNO, LASTNAME,
DEPT, JOB
FROM EMP
WHERE DEPT = 'D11'
FOR UPDATE OF JOB
END-EXEC.
-
示例:打开光标
-
以下语句将光标置于:
EXEC SQL
OPEN THISEMP
END-EXEC.
-
示例:使用光标检索一行
-
以下语句使用游标THISEMP来检索一行:
EXEC SQL
FETCH THISEMP
INTO :EMP-NUM, :NAME2,
:DEPT, :JOB-NAME
END-EXEC.
-
示例:使用光标更新当前行
-
以下语句使用游标THISEMP更新部门中特定员工的JOB值 D11:
EXEC SQL
UPDATE EMP
SET JOB = :NEW-JOB
WHERE CURRENT OF THISEMP
END-EXEC.
-
示例 关闭光标
-
以下语句将光标移至末尾:
EXEC SQL
CLOSE THISEMP
END-EXEC.
更多关于游标的介绍
如果光标不可滚动,每次获取操作会将光标定位到下一行或下一组行。
可滚动光标
可以前后滚动,并可以重新定位在开始、结束或相对偏移点。 应用程序可以使用一组强大的SQL语句,通过游标以随机顺序获取数据。 可滚动光标对于屏幕应用程序特别有用。 您可以指定结果表中的数据保持不变。 例如,会计应用程序可能要求数据保持不变,而航空预订系统应用程序则必须显示最新的航班可用性信息。
您还可以在DECLARE CURSOR语句中定义选项,指定可滚动光标在插入、更新或删除操作时对基础数据变化的敏感程度。
-
敏感的光标
对结果表生成后数据库中的更改很敏感。 例如,当应用程序使用光标执行定位UPDATE和DELETE语句时,这些更改将显示在结果表中。
-
不
敏感游标
对生成结果表后对结果表的基础行进行的插入、更新或删除不敏感。 例如,在应用程序打开光标后,结果表的行顺序和每行的值都不会改变。
要表明光标可以滚动,可以用SCROLL关键字声明。
例如,以下示例显示了一个不敏感的可滚动光标的声明:
EXEC SQL DECLARE C1 INSENSITIVE SCROLL CURSOR FOR
SELECT DEPTNO, DEPTNAME, MGRNO
FROM DEPT
ORDER BY DEPTNO
END-EXEC.
要使用光标获取结果表的第五行,可以使用FETCH语句,如下例所示:
EXEC SQL FETCH ABSOLUTE +5 C1 INTO :HVDEPTNO, :DEPTNAME, :MGRNO;
Db2 for z/OS®
提供了另一种光标,称为
动态可滚动光标
。 借助动态可滚动光标,应用程序可以直接在基础表格上滚动,同时访问最新数据。