我最近注意到调用 dbms_mview.refresh(...) 会刷新 Oracle 中的物化视图,它具有隐式提交。
任何想法——除了“因为它确实”——为什么这个动作有一个隐含的提交?
我最近注意到调用 dbms_mview.refresh(...) 会刷新 Oracle 中的物化视图,它具有隐式提交。
任何想法——除了“因为它确实”——为什么这个动作有一个隐含的提交?
根据 Tom Kyte 的说法,这是因为在设计时决定将刷新视为 DDL 操作。由于所有 DDL 操作都隐式提交,所以这个也是。不幸的是,他没有回答他们为什么选择将其制作为 DDL 的问题。
根据您的 Oracle 版本和/或您提供的参数,dbms_mview.refresh 可能会执行 TRUNCATE,然后执行直接加载。TRUNCATE 是一个 DDL 命令,因此发出一个隐式提交。直接加载不需要提交。
如果您使用的是更新版本的 Oracle,我认为是 10.2+,您可以将 atomic_refresh 参数设置为 TRUE,它将使用标准的 DELETE / INSERT 在单个事务中刷新。不过,这种方法可能会慢一些。
解决方法是在自治事务中调用 dbms_mview.refresh(使用 pragma 自治事务创建一个 PL/SQL 过程)。