从游标访存行 (PL/SQL)
从 PL/SQL 游标访存行所需的 FETCH 语句受 PL/SQL 上下文中的 Db2® 数据服务器支持。
语法
描述
- 游标名
- 静态游标或游标变量的名称。
- 记录
- 先前定义的记录的标识。 这可以是用户定义的记录,也可以是使用 %ROWTYPE 属性从表派生的记录定义。
- variable
- 用于存放所访存行中的字段数据的 PL/SQL 变量。 您可以定义一个或多个变量,但是,它们在顺序和数目方面必须与游标声明所指定查询的选择列表中返回的字段匹配。 选择列表中字段的数据类型与记录中字段的数据类型或者变量的数据类型必须匹配或可隐式地转换。
您可以显式地定义变量数据类型或者使用 %TYPE 属性来定义变量数据类型。
- BULK COLLECT INTO 数组变量
- 标识一个或多个具有数组数据类型的变量。 结果的每一行都按结果集的顺序被指定给每个数组中的元素,并按顺序指定数组下标。
- 如果只指定了一个 数组变量:
- 如果 数组变量 元素的数据类型不是记录类型,那么游标的结果行必须正好包含一列,并且该列的数据类型必须可指定给数组元素数据类型。
- 如果 数组变量 元素的数据类型是记录类型,那么游标的结果行必须可指定给记录类型。
- 如果指定了多个数组变量:
- 数组变量 元素的数据类型不能是记录类型。
- 对于游标的结果行中的每一列,都必须存在一个 数组变量。
- 游标的结果行中每一列的数据类型都必须可指定给相应 数组变量 的数组元素数据类型。
- 如果只指定了一个 数组变量:
- 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;