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® 提供了另一种光标,称为 动态可滚动光标 。 借助动态可滚动光标,应用程序可以直接在基础表格上滚动,同时访问最新数据。

  •