oracle如何刷新物化视图

Posted

技术标签:

【中文标题】oracle如何刷新物化视图【英文标题】:How to refresh materialized view in oracle 【发布时间】:2012-07-18 06:52:06 【问题描述】:

我正在尝试使用以下方法刷新物化视图:

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;

又报错了。

请针对此问题提出解决方案。

谢谢, 斯里尼瓦斯

【问题讨论】:

您使用的是exec DBMS_MVIEW.REFRESH('v_materialized_foo_tbl');exec MAT_VIEW_FOO_TBL 还是BEGIN DBMS_MVIEW.REFRESH('v_materialized_foo_tbl'); END;?这些中的任何一个都应该有效。 我尝试使用 exec MAT_VIEW_FOO_TBL;也开始 DBMS_MVIEW.REFRESH('v_materialized_foo_tbl');结尾;但没有用。 我认为您是从 php 作为 sql 语句执行它。它应该作为程序执行。我不知道php。你如何称呼这些陈述。来自 Toad/SQLDeveloper 还是使用 php? 并且...您应该使用 'V_MATERIALIZED_FOO_TBL' 而不是小写来调用它。 是的,我正在从 Zend Studio 执行这些语句。我尝试使用大写字母 BEGIN DBMS_MVIEW.REFRESH('V_MATERIALIZED_FOO_TBL');结尾;其中它给出了新的错误 ORA-06550:第 1 行,第 59 列:PLS-00103:在预期以下情况之一时遇到符号“”:; 符号 "; 被插入 "" 之前以继续。 【参考方案1】:

试试这个:

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

first 参数是mat_view 的名称,second 定义refresh 的类型。 f 表示快速刷新。 但请记住,它会覆盖任何其他刷新时间选项。

【讨论】:

这在像 SQL Developer 这样的 IDE 中运行良好,但如果你是从代码(如 ODP.NET 等)执行它,那么它必须像 @Waqas Ali 建议的那样包装在 BEGIN 和 END 中. @TomHalladay 使用EXECUTE 有什么问题吗? (对于我来说,SQL Developer 中的 raw 函数肯定不起作用。)【参考方案2】:

运行此脚本以刷新物化视图中的数据:

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

【讨论】:

以上代码经过多次测试,运行良好,没有异常/错误。你的工具/机械等可能有问题。 如果您有架构,请使用以下dbms_snapshot.refresh('schema.view');【参考方案3】:

如果您使用的是 SQL Developer,则必须将 dbms_view 设为小写。尽管我还没有从代码中调用该过程,但其余部分对我来说编译得很好。

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

【讨论】:

【参考方案4】:

游戏有点晚了,但我找到了一种方法可以使这个问题中的原始语法正常工作(我在 Oracle 11g 上)

**首先切换到你的MV的架构**

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

您也可以添加一些选项:

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

这实际上对我有用,并且添加并行选项将我的执行速度提高了大约 2.5 倍。

更多信息在这里:How to Refresh a Materialized View in Parallel

【讨论】:

【参考方案5】:

您可以按如下方式完全刷新物化视图:

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

【讨论】:

【参考方案6】:

尝试使用以下语法:

常用语法:

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

例子:

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

希望以上内容有所帮助。

【讨论】:

【参考方案7】:

最好的选择是使用“?”方法的论据。这样 DBMS_MVIEW 会选择最好的刷新方式,所以它会为你做最快的刷新。 ,并且如果您在实际需要完全刷新时尝试类似 method=>'f' 之类的方法,则不会失败。 :-)

从 SQL*Plus 提示符:

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

【讨论】:

【参考方案8】:

当我们必须使用内置程序或包时,我们必须使用“EXECUTE”命令然后它才会起作用。

前:

EXECUTE exec DBMS_MVIEW.REFRESH('v_materialized_foo_tbl');

【讨论】:

欢迎来到 ***。请花一些时间阅读如何写一个好的答案。阅读this和this【参考方案9】:

EXECUTE dbms_mview.refresh('view name','cf');

【讨论】:

以上是关于oracle如何刷新物化视图的主要内容,如果未能解决你的问题,请参考以下文章

oracle物化视图不会自动更新是怎么回事

oracle如何刷新物化视图

Oracle - 物化视图在完全刷新期间仍可访问。这是如何运作的?

解决oracle 物化视图刷新失败

Oracle 物化视图日志

Oracle-视图