在打开游标后,可通过使用 FETCH 语句从该游标的结果集检索行。

FETCH name INTO { record | variable [, variable_2 ]... };

name 是先前打开的游标的标识符。record 是先前定义的记录(例如,使用 table%ROWTYPE)的标识符。variable, variable_2... 是将从提取的行接收字段数据的 SPL 变量。record 或 variable, variable_2... 中字段的数字和顺序必须与 SELECT 列表(属于游标声明中给出的查询)中返回的字段相匹配。对于 SELECT 列表中的字段,其数据类型必须与 record 中字段的数据类型或 variable, variable_2... 的数据类型相匹配或者可隐式转换为这些数据类型。

说明 存在使用 BULKCOLLECT 子句的 FETCH INTO 的变体,该变体可一次将多行返回到集合中。

下面显示了 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。这样,即使更改了数据库列的数据类型,也不必更改 SPL 程序中的目标变量声明。%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 语句会将检索到的数据放入该记录中。这样,便可使用点表示法访问该记录中的每个字段。

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;