database - 光标正在返回表中可用的更多数据

标签 database oracle plsql oracle11g toad

我有疑问

select * from ot.city_vw;

传入的数据是: enter image description here

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

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

最后一张表的数据是下图的两倍:

enter image description here

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

最佳答案

向上移动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 会为您完成所有脏活(声明游标变量、打开游标、退出循环、关闭游标)。我建议您尽可能使用它。

关于database - 光标正在返回表中可用的更多数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58320315/

相关文章:

mysql - SQL:每个字段值计数的输出表

Oracle 的 C# 参数化查询 - 严重而危险的错误!

oracle - 关于pl/sql异常的问题

oracle - 如何消除子类型依赖?

sql-server - 在数据库中存储各种统计数据的最佳方法

PHP 搜索 SQL 数据库

database - 从类图创建对象关系模式

php - PHP上的MySQL文本数据限制

c - 从 OCI 中的绑定(bind)名称获取绑定(bind)位置

plsql - Forall 语句中立即执行的编译问题