在目前為止提供的游標(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