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