问题:
fetch c into v_ename;,一定要放在 exit when (c%notfound);前面才行. 不然会把最后一条记录多输出一遍。
注意点:
1、pl/sql中的boolean类型变量还有个null值,并且还是默认的.除此之外还有true,false。
2、对于显式游标而言,open后第一次fetch之前cursor%notfound的值为null。
代码如下:
declare
cursor c is select ename from emp20;
v_flag boolean;
v_ename emp20.ename%type;
begin
open c;
loop
v_flag := c%notfound;
if v_flag then
dbms_output.put_line('true');
dbms_output.put_line(v_ename);
elsif v_flag=false then
dbms_output.put_line('false');
dbms_output.put_line(v_ename);
else
dbms_output.put_line('null');--第一次循环的时候为null
dbms_output.put_line(v_ename);
end if;
exit when c%notfound;
fetch c into v_ename;
end loop;
close c;
end;
输出如下:
所以游标的notfound属性值取决于fetch的结果,而非取决于游标当前是否指向一条有效记录。notfound并不是表示当前游标是不是指向一条有效记录。