我现在正在使用游标,这对我来说变得很乱,希望你能向我强调一些问题。
我已经检查了有关游标的 oracle 文档,但我找不到:
打开游标时,是否会在内存中创建结果的本地副本?
- 是的:如果我有一个包含大量数据的表,这真的有意义吗?我认为它不会真正有效,不是吗?
否:整个数据是否锁定到其他进程?
是的:如果我为每一行做一个真正繁重的过程,数据将在很长一段时间内不可用......
否:如果另一个进程修改了我当前与游标一起使用的数据,或者如果它添加了新行,会为游标更新它会发生什么?
非常感谢。
您的具体问题的答案:
打开游标时,是否会在内存中创建结果的本地副本?
不,但是通过 Oracle 的“多版本读取一致性”(参见上面的链接),游标获取的行都将与打开游标的时间点一致 - 即,获取时的每一行都将是当cursor 已打开并且仍然具有相同的值(即使另一个会话可能同时更新甚至删除了它)。
否:整个数据是否锁定到其他进程?
不
否:如果另一个进程修改了我当前与游标一起使用的数据,或者如果它添加了新行,会为游标更新它会发生什么?
您的游标不会看到这些更改,它会继续处理打开游标时存在的行。
概念指南详细解释了这一点,但其工作方式的本质如下:
如果需要,您可以修改此默认行为。例如,如果在游标运行期间没有其他会话修改您正在查询的行是至关重要的,那么您可以使用该FOR UPDATE
子句来锁定行:
CURSOR c IS SELECT sal FROM emp FOR UPDATE OF sal;
现在,在查询运行时尝试修改查询中使用的行的任何会话都会被阻止,直到您的查询完成提交或回滚。