Database 游标正在返回表中可用的更多数据

Database 游标正在返回表中可用的更多数据,database,oracle,plsql,oracle11g,toad,Database,Oracle,Plsql,Oracle11g,Toad,我有疑问 select * from ot.city_vw; 数据如下: 但是当我编写pl/sql块来获取数据时 declare v_data OT.city%rowtype; CURSOR cur1 is select * from ot.city_vw; begin open cur1; loop fetch cur1 into v_data; dbms_output.put_line(v_data.city_id); dbms_output.put_line(v_data.city

我有疑问

select * from ot.city_vw;
数据如下:

但是当我编写pl/sql块来获取数据时

declare
v_data OT.city%rowtype;
CURSOR cur1  is
select * from ot.city_vw;
begin

open cur1;
loop
fetch cur1 into v_data;
dbms_output.put_line(v_data.city_id);
dbms_output.put_line(v_data.city_name);
 EXIT WHEN cur1%NOTFOUND;
    END LOOP;
    CLOSE cur1;
end;
/
最后一个表数据是图片中的两倍:


我的光标有什么问题?为什么最后一个数据会出现两次?

向上移动
退出

open cur1;
loop
  fetch cur1 into v_data;
  EXIT WHEN cur1%NOTFOUND;                      --> here
  dbms_output.put_line(v_data.city_id);
  dbms_output.put_line(v_data.city_name);
END LOOP;
CLOSE cur1;

或者,更好的是,用户光标
FOR
循环:

begin
  for v_data in (select * from ot.city_vw) 
  loop
    dbms_output.put_line(v_data.city_id);
    dbms_output.put_line(v_data.city_name);
  end loop;
end;
看起来不是更简单吗?Oracle为您完成所有的脏工作(声明游标变量、打开游标、退出循环、关闭游标)。我建议你尽可能使用它