Oracle 為每個 SQL 陳述式隱式建立游標。顯式游標由開發者命名、定義,用於處理 SELECT 回傳的多列結果集 (Active Set),提供指標逐列處理能力。
DECLARE
CURSOR c1 IS
SELECT view_name FROM all_views WHERE rownum <= 10 ORDER BY view_name;
-- 帶參數版
CURSOR c2 (p_limit NUMBER) IS
SELECT view_name FROM all_views WHERE rownum <= p_limit;
v_name VARCHAR2(40);
BEGIN
...
參數僅在游標範圍內可見,外部引用會報錯。
OPEN c1;
-- 或 OPEN c2(5);
開啟後結果集靜態化,後續 DML 不影響已開啟游標;需重新開啟才刷新。
FETCH c1 INTO v_name;
WHILE c1%FOUND LOOP
DBMS_OUTPUT.PUT_LINE(c1%ROWCOUNT || ' ' || v_name);
FETCH c1 INTO v_name;
END LOOP;
| 屬性 | 型別 | 含義 |
|---|---|---|
| %FOUND | BOOLEAN | 最近一次 FETCH 成功傳回列 → TRUE |
| %NOTFOUND | BOOLEAN | 與 %FOUND 相反 |
| %ISOPEN | BOOLEAN | 游標處於開啟狀態 → TRUE |
| %ROWCOUNT | NUMBER | 已擷取列數 |
CLOSE c1;
關閉後再操作會拋出 INVALID_CURSOR 例外。區塊結束時 Oracle 會隱式關閉。
DECLARE
CURSOR c1 IS SELECT view_name FROM all_views WHERE rownum <= 10 ORDER BY view_name;
v_name VARCHAR2(40);
BEGIN
OPEN c1;
FETCH c1 INTO v_name;
WHILE c1%FOUND LOOP
DBMS_OUTPUT.PUT_LINE(TO_CHAR(c1%ROWCOUNT) || ' ' || v_name);
FETCH c1 INTO v_name;
END LOOP;
CLOSE c1;
END;
/
顯式游標避免重複剖析 (Parsing),針對重複執行的靜態查詢可顯著降低 CPU 開銷;配合 BULK COLLECT/FORALL (8i 以上) 更能批次處理大量資料。