2009-05-06 39 views
4

我最近注意到,调用dbms_mview.refresh(...),刷新Oracle中的物化视图,具有隐式提交。为什么DBMS_MVIEW.REFRESH具有隐式提交?

任何想法 - 除了“因为它” - 为什么这个动作有一个隐式的提交?

+0

您正在使用哪个版本的Oracle? – David 2009-05-06 11:56:45

+0

我正在使用Oracle 10g(10.2) – 2009-05-07 22:50:21

回答

1

根据您的Oracle版本和/或您提供的参数,dbms_mview.refresh可能会执行TRUNCATE,然后是直接加载。 TRUNCATE是DDL命令,因此会发出隐式提交。直接加载不需要提交。

如果您使用的是更新版本的Oracle,我认为它的值为10.2+,那么您可以将atomic_refresh参数设置为TRUE,并使用标准DELETE/INSERT在单个事务内刷新。尽管如此,这种方法可能会相当慢。

4

据汤姆凯特这是因为a decision was made at design time to consider refreshing to be a DDL operation。由于所有的DDL操作都隐式提交,所以这个操作也是如此。不幸的是,他不回答为什么他们选择使其成为DDL的结果问题。

+0

汤姆很棒,但他倾向于抛弃这些“因为它确实”的答案。 – 2009-05-07 22:52:55

+0

是的,他通常会回答任何人都无法回答的问题。 – 2009-05-08 13:21:59

0

工作范围是在自治事务中执行对dbms_mview.refresh的调用(使用pragma autonomous_transaction创建PL/SQL过程)。