2009-05-06 67 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過程)。