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

Cursor is returning more data that is available in table

我有疑问

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;
/

最后的table数据来了两次,如下图:

我的光标有什么问题?为什么最后的数据来了两次?

上移EXIT

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 为您完成所有 dirty 工作(声明游标变量、打开游标、退出循环、关闭游标)。我建议你尽可能使用它。