在打開游標后,可通過使用 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;