开始
SET SERVEROUTPUT ON;DECLARE v_empno emp.empno%TYPE; v_ename emp.ename%TYPE; CURSOR emp_cursor IS SELECT empno,ename from emp where empno<>1000; BEGINLOOP IF NOT emp_cursor%ISOPEN THEN OPEN emp_cursor; END IF; FETCH emp_cursor INTO v_empno,v_ename; EXIT WHEN emp_cursor%NOTFOUND; dbms_output.put_line('empno is:' || v_empno || ' emp name is:' || v_ename); END LOOP;END;/
运行结果
anonymous block completedempno is:7369 emp name is:SMITHempno is:7499 emp name is:ALLENempno is:7521 emp name is:WARDempno is:7566 emp name is:JONESempno is:7654 emp name is:MARTINempno is:7698 emp name is:BLAKEempno is:7782 emp name is:CLARKempno is:7788 emp name is:SCOTTempno is:7839 emp name is:KINGempno is:7844 emp name is:TURNERempno is:7876 emp name is:ADAMSempno is:7900 emp name is:JAMESempno is:7902 emp name is:FORDempno is:7934 emp name is:MILLER
要注意的一点:FETCH 后,马上进行EXIT 比较好。这是因为如果不是这样,在循环中还有来一次,此时可能有干了一些操作,这回导致出现问题。
还有一点,由于 第一次FETCH之前,%NOTFOUND 的值为空。
所以如果 FETCH 从来没有真的成功过,那么 EXIT WHEN emp_cusor%NOTFOUND 有可能一直为NULL,这样就一直在循环里无法退出。所以,更好的写法是:
EXIT WHEN emp_cursor%NOTFOUND OR emp_cursor%NOTFOUND IS NULL
结束