默認情況下,過程將作爲會話擁有的較大事務的一部分執行。由於documentation提到:
注:事務可以跨越多個塊,塊可以包含多個事務。
利用如上描述你的代碼,沒有其他的會議將看到您刪除或插入,直到你調用該過程後提交。如果你只是從SQL *執行它加提示,例如:
SQL> exec loadDenormalizedTable;
PL/SQL procedure successfully completed.
SQL>
...然後別人看着表仍然會看到舊的數據,即使同時刪除和插入後已經完成。 (其他任何人試圖執行該過程,或插入或刪除denormalizedTable
中的數據,都會阻止,但可能你只希望其他人查詢它)。一旦你發出commit
,那麼每個人都會看到同樣的事情。
讓你形容是在過程中手動結束交易行爲的唯一方法:
CREATE OR REPLACE PROCEDURE loadDenormalizedTable IS
BEGIN
DELETE FROM denormalizedTable;
COMMIT WORK; -- makes the delete visible elsewhere
INSERT INTO
denormalizedTable
(
data
)
SELECT DISTINCT
data
FROM
normalizedTables;
END;
/
你不不需要commit
在程序的中間,這是非常罕見的,你將會或應該永遠想要這樣做,因爲它打破了原子性。
這是可能的,你正在做的事情,做一個隱含的承諾,而你意識到這一點;也許調用另一個執行它自己的提交的過程或函數(這樣做的原因之一 - 它可能會有意想不到的副作用!),或者DDL語句 - 它總是會在後臺執行隱式提交,但是你無論如何,動態SQL必須這樣做。其他
一種可能性是,你實際上並沒有做delete
,但是,你正在做一個truncate
。如果沒有明確的提交,那麼其他人立即就會看到這一點,暗示爲in the documentation。這也將與您提供的大綱背道而馳。直到你提交時,你不應該在過程中做
的刪除不會對其他會話可見。所以你會看到空桌子,但沒有人會。這是你真實程序的一個明顯縮減版嗎?此外...你重塑[物化視圖(http://docs.oracle.com/cd/E11882_01/server.112/e25789/schemaob.htm#CFAIGHFC)? –
謝謝!會議問題讓我感到沮喪。我現在看到,在刷新表格時,應用程序仍然可以看到數據。這是削減的,我刪除了所有的實際表和列,只是放在佔位符。雖然結構相同。是的,這是重塑物化視圖,數據架構師並不是MV的粉絲。 – wshato
什麼是席位視圖錯誤?它可以以原子方式或非原子方式刷新。而且一旦創建,所有這些工作都可以簡化爲單個刷新語句。我不會說我對你的數據有什麼看法「建築師」 – tbone