从游标访存行 (PL/SQL)

从 PL/SQL 游标访存行所需的 FETCH 语句受 PL/SQL 上下文中的 Db2® 数据服务器支持。

语法

读取语法图跳过可视语法图FETCH游标名INTO记录,变量块收集子句
块收集子句
读取语法图跳过可视语法图BULK COLLECT INTO ,数组变量 LIMIT整数常量

描述

游标名
静态游标或游标变量的名称。
记录
先前定义的记录的标识。 这可以是用户定义的记录,也可以是使用 %ROWTYPE 属性从表派生的记录定义。
variable
用于存放所访存行中的字段数据的 PL/SQL 变量。 您可以定义一个或多个变量,但是,它们在顺序和数目方面必须与游标声明所指定查询的选择列表中返回的字段匹配。 选择列表中字段的数据类型与记录中字段的数据类型或者变量的数据类型必须匹配或可隐式地转换。

您可以显式地定义变量数据类型或者使用 %TYPE 属性来定义变量数据类型。

BULK COLLECT INTO 数组变量
标识一个或多个具有数组数据类型的变量。 结果的每一行都按结果集的顺序被指定给每个数组中的元素,并按顺序指定数组下标。
  • 如果只指定了一个 数组变量
    • 如果 数组变量 元素的数据类型不是记录类型,那么游标的结果行必须正好包含一列,并且该列的数据类型必须可指定给数组元素数据类型。
    • 如果 数组变量 元素的数据类型是记录类型,那么游标的结果行必须可指定给记录类型。
  • 如果指定了多个数组变量:
    • 数组变量 元素的数据类型不能是记录类型。
    • 对于游标的结果行中的每一列,都必须存在一个 数组变量
    • 游标的结果行中每一列的数据类型都必须可指定给相应 数组变量 的数组元素数据类型。
如果 数组变量 的数据类型是普通数组,那么最大基数必须大于或等于查询所返回的行数,或者大于或等于 LIMIT 子句中指定的 整数常量
LIMIT 整数常量
指定存储在目标数组中的行的数目限制。 游标位置将向前移动 整数常量 行或者移至结果集末尾。

示例

以下示例演示包含 FETCH 语句的过程。
CREATE OR REPLACE PROCEDURE cursor_example
IS
    v_empno         NUMBER(4);
    v_ename         VARCHAR2(10);
    CURSOR emp_cur_3 IS SELECT empno, ename FROM emp WHERE deptno = 10
        ORDER BY empno;
BEGIN
    OPEN emp_cur_3;
    FETCH emp_cur_3 INTO v_empno, v_ename;
        ...
END;
如果使用 %TYPE 属性来定义目标变量的数据类型,那么在数据库列的数据类型更改时,不需要更改 PL/SQL 应用程序中的目标变量声明。 以下示例演示包含使用 %TYPE 属性定义的变量的过程。
CREATE OR REPLACE PROCEDURE cursor_example
IS
    v_empno         emp.empno%TYPE;
    v_ename         emp.ename%TYPE;
    CURSOR emp_cur_3 IS SELECT empno, ename FROM emp WHERE deptno = 10
        ORDER BY empno;
BEGIN
    OPEN emp_cur_3;
    FETCH emp_cur_3 INTO v_empno, v_ename;
        ...
END;
如果表中的所有列都按它们的定义顺序进行检索,那么可以使用 %ROWTYPE 属性来定义一个记录,FETCH 语句将把检索到的数据放入该记录。 然后,可以使用点分表示法来访问该记录中的每个字录。 以下示例所演示的过程包含一个使用了 %ROWTYPE 的记录定义。 此记录被用作 FETCH 语句的目标。
CREATE OR REPLACE PROCEDURE cursor_example 
IS
     v_emp_rec       emp%ROWTYPE;
     CURSOR emp_cur_1 IS SELECT * FROM emp; 
BEGIN     
     OPEN emp_cur_1;
     FETCH emp_cur_1 INTO v_emp_rec;
     DBMS_OUTPUT.PUT_LINE('Employee Number: ' || v_emp_rec.empno);
     DBMS_OUTPUT.PUT_LINE('Employee Name  : ' || v_emp_rec.ename);
END;