2012-07-19 146 views
36

蔭嘗試使用刷新物化視圖:如何刷新在Oracle物化視圖

DBMS_MVIEW.REFRESH('v_materialized_foo_tbl') 

但它拋出無效的SQL語句。

然後,我創建了一個存儲過程是這樣的:

CREATE OR REPLACE 
PROCEDURE MAT_VIEW_FOO_TBL 
IS 
BEGIN 
    DBMS_MVIEW.REFRESH('v_materialized_foo_tbl') 
END MAT_VIEW_FOO_TBL IS; 

此過程已經成功創建,但是當我打電話與

MAT_VIEW_FOO_TBL; 

此過程中它再次拋出一個錯誤。

請提出針對此問題的解決方案。

謝謝, SRINIVAS

+4

您是否在使用'exec DBMS_MVIEW.REFRESH('v_materialized_foo_tbl');'或'exec MAT_VIEW_FOO_TBL'或'BEGIN DBMS_MVIEW.REFRESH('v_materialized_foo_tbl'); END;'?任何這些應該工作。 – 2012-07-19 06:18:08

+0

我用exec MAT_VIEW_FOO_TBL嘗試過;還BEGIN DBMS_MVIEW.REFRESH('v_materialized_foo_tbl');結束;但沒有工作。 – Srinivas 2012-07-19 06:24:00

+0

我想你是從PHP執行它作爲sql語句。它應該按程序執行。我不知道PHP。你如何稱呼這些陳述。從蟾蜍/ SQLDeveloper或與PHP? – 2012-07-19 06:31:30

回答

35

嘗試:

DBMS_SNAPSHOT.REFRESH('v_materialized_foo_tbl','f'); 

第一參數是mat_view名稱和第二定義的refresh類型。 f表示快速刷新。 但請記住這個事情,它會覆蓋任何其他刷新時間選項。

+2

這工作正常在像SQL Developer的IDE,但如果你是從代碼(如ODP.NET等..)執行它,那麼它必須包裝在BEGIN &END as @Waqas Ali suggest。 – 2014-04-22 05:50:57

+1

@TomHalladay使用'EXECUTE'是否有問題?(原始函數當然不適用於SQL Developer。) – jpmc26 2014-06-17 08:46:50

44

運行此腳本在物化視圖刷新數據:

BEGIN 
DBMS_SNAPSHOT.REFRESH('Name here'); 
END; 
+0

以上代碼經過多次測試,並且工作正常很好,沒有異常/錯誤,可能是你的工具/ mechane等問題。 – 2013-10-02 10:46:55

1

如果你使用SQL Developer的工作,你必須把dbms_view小寫。其餘的編譯好,雖然我還沒有從代碼中調用過程。

CREATE OR REPLACE PROCEDURE "MAT_VIEW_FOO_TBL" AS 
BEGIN 
    dbms_mview.refresh('v_materialized_foo_tbl'); 
END; 
6

有點晚了比賽,但我找到了一種方法,使這一問題的工作(我上的Oracle 11g)

**第一開關原來的語法來MV的模式* *

EXECUTE DBMS_MVIEW.REFRESH(LIST=>'MV_MY_VIEW'); 

或者你也可以添加一些選項:

EXECUTE DBMS_MVIEW.REFRESH(LIST=>'MV_MY_VIEW',PARALLELISM=>4); 

這實際上對我的作品,並添加parall elism選項將我的執行速度提高了大約2.5倍。

此處瞭解詳情:How to Refresh a Materialized View in Parallel

4

您可以完全刷新物化視圖如下:

EXECUTE 
DBMS_SNAPSHOT.REFRESH('Materialized_VIEW_OWNER_NAME.Materialized_VIEW_NAME','COMPLETE'); 
0

嘗試使用下面的語法:

常見語法:

begin 
dbms_mview.refresh('mview_name'); 
end; 

例如:

begin 
dbms_mview.refresh('inv_trans'); 
end; 

希望以上幫助。

0

最好的選擇是使用'?'該方法的論點。這樣DBMS_MVIEW將選擇最好的刷新方式,所以它會盡快爲您刷新。 ,如果你真的需要一個完整的刷新,如果你嘗試像method =>'f'那樣的話,它不會失敗。 :-)

從SQL * Plus提示符:

EXEC DBMS_MVIEW.REFRESH('my_schema.my_mview', method => '?'); 
-1

當我們不得不使用內置的程序,或者我們必須使用包「執行」命令,然後它會工作。

EX:

EXECUTE EXEC DBMS_MVIEW.REFRESH( 'v_materialized_foo_tbl');

+2

歡迎使用Stackoverflow,請花些時間閱讀h寫一個很好的答案。閱讀[this](http://meta.stackexchange.com/a/7659/338114)和[this](http://stackoverflow.com/help/how-to-answer) – 2017-02-09 07:10:56