[英]fetch bulk collect with limit question (Oracle)
再会! 环境:Oracle 12.2 EE 64 位。
假设我有一个代码:
Declare
Rc sys_refcursor;
Type mt is varchar2(25);
Type_mt_t is table of mt;
Mem_tbl mt_t;
begin
Open rc for
Select a.a from tbl a
Where a.path =’1’
And not exists
(select 1 from tbl b
Where b.path=’-1’
And b.a = a.a);
Loop
Fetch rc bulk collect into mem_tbl limit 500;
Exit when …
End loop;
End;
问题是——Open rc子句是一次预取所有数据,还是每次在“提取循环”中调用时重新扫描参考游标? 我是关于读取一致性和可能(当然是不希望的)在获取批量收集限制循环期间的游标突变。
任何帮助将不胜感激。
TIA,安德鲁。
不会。您在 Oracle 中打开游标的那一刻,结果即刻“一成不变”。 这并不意味着我们实际上会读取所有数据 - 我们只需要在您获取时读取它。
当然,这提出了一个问题——当我们获取并偶然发现自游标打开后其他人已更改的某些数据时会发生什么? (因为我们在阅读时不会阻止任何人)。
我们使用内部“撤消”信息来撤销这些更改(在内存中),以便我们可以为调用者(您)提供查询开始时的数据版本。
您永远不会看到在查询开始后提交的那些更改——您总是会得到一组干净、一致的行。
如果您想要对此进行更长时间、更详细的报道,我在这个播客中花了大约 20 分钟
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.