源自 http://375940084.blog.51cto.com/2581965/1060822/ 棉花糖的博客
1 CREATE OR REPLACE PROCEDURE PRC_LJ IS 2 CURSOR C_EMP IS --声明显式游标 3 SELECT EMPNO,ENAME FROM EMP; 4 C_ROW C_EMP%ROWTYPE; --定义游标变量,该变量的类型为基于游标C_EMP的记录 5 BEGIN 6 --For 循环 7 FOR C_ROW IN C_EMP LOOP 8 DBMS_OUTPUT.PUT_LINE(C_ROW.EMPNO || '--' || C_ROW.ENAME); 9 END LOOP; 10 11 --Fetch 循环 12 OPEN C_EMP;--必须要明确的打开和关闭游标 13 LOOP 14 FETCH C_EMP 15 INTO C_ROW; 16 EXIT WHEN C_EMP%NOTFOUND; 17 DBMS_OUTPUT.PUT_LINE(C_ROW.EMPNO || '++' || C_ROW.ENAME); 18 END LOOP; 19 CLOSE C_EMP; 20 21 --While 循环 22 OPEN C_EMP;--必须要明确的打开和关闭游标 23 FETCH C_EMP INTO C_ROW; 24 WHILE C_EMP%FOUND LOOP 25 DBMS_OUTPUT.PUT_LINE(C_ROW.EMPNO || '**' || C_ROW.ENAME); 26 FETCH C_EMP INTO C_ROW; 27 END LOOP; 28 CLOSE C_EMP; 29 END PRC_LJ;
第一种使用For 循环
for循环是比较简单实用的方法。
首先,它会自动open和close游标。解决了你忘记打开或关闭游标的烦恼。
其次,自动声明一个记录类型及定义该类型的变量,并自动fetch数据到这个变量。
注意C_ROW 这个变量无需要在循环外进行声明,无需为其指定数据类型。它是一个记录类型,具体的结构是由游标决定的。
这个变量的作用域仅仅是在循环体内。
最后,与该游标关联的所有记录都已经被取回后,循环无条件结束,不必判定游标的%NOTFOUND属性为TRUE。
for循环是用来循环游标的最好方法。高效,简洁,安全。
第二种使用Fetch循环
注意,exit when语句一定要紧跟在fetch之后,避免多余的数据处理。
处理逻辑需要跟在exit when之后。
循环结束后要记得关闭游标。
第三种使用While循环
使用while 循环时,需要在循环之前进行一次fetch动作,游标的属性才会起作用。
而且数据处理动作必须放在循环体内的fetch方法之前,循环体内的fetch方法要放在最后,否则就会多处理一次。