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