在目前為止提供的游標(biāo)示例中,處理游標(biāo)結(jié)果集所需的編程邏輯包括一個(gè)用于打開游標(biāo)的語句、一個(gè)用于檢索結(jié)果集的每一行的循環(huán)結(jié)構(gòu)、一個(gè)用于結(jié)果集末尾的測試和一個(gè)用于關(guān)閉游標(biāo)的語句。游標(biāo) FOR 循環(huán)是一個(gè)循環(huán)結(jié)構(gòu),使用戶無需單獨(dú)編寫剛剛列出的語句。

游標(biāo) FOR 循環(huán)打開先前聲明的游標(biāo),獲取游標(biāo)結(jié)果集中的所有行,然后關(guān)閉游標(biāo)。

創(chuàng)建游標(biāo) FOR 循環(huán)的語法如下所示。

FOR record IN cursor
LOOP
   statements
END LOOP;

record 是通過定義 cursor%ROWTYPE 分配給隱式聲明的記錄的標(biāo)識(shí)符。cursor 是先前聲明的游標(biāo)的名稱。statements 是一個(gè)或多個(gè) SPL 語句。必須至少有一個(gè)語句。

以下示例顯示了%NOTFOUND中的示例,修改為使用游標(biāo) FOR 循環(huán)。

CREATE OR REPLACE PROCEDURE cursor_example
IS
    CURSOR emp_cur_1 IS SELECT * FROM emp;
BEGIN
    DBMS_OUTPUT.PUT_LINE('EMPNO    ENAME');
    DBMS_OUTPUT.PUT_LINE('-----    -------');
    FOR v_emp_rec IN emp_cur_1 LOOP
        DBMS_OUTPUT.PUT_LINE(v_emp_rec.empno || '     ' || v_emp_rec.ename);
    END LOOP;
END;

實(shí)現(xiàn)了相同的結(jié)果,如下面的輸出所示。

EXEC cursor_example;

EMPNO    ENAME
-----    -------
7369     SMITH
7499     ALLEN
7521     WARD
7566     JONES
7654     MARTIN
7698     BLAKE
7782     CLARK
7788     SCOTT
7839     KING
7844     TURNER
7876     ADAMS
7900     JAMES
7902     FORD
7934     MILLER