2012-07-19 151 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