【问题标题】:How to refresh materialized view in oracleoracle如何刷新物化视图
【发布时间】: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:在预期以下情况之一时遇到符号“”:; 符号 "; 被插入 "" 之前以继续。

标签: oracle materialized-views


【解决方案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');

            【讨论】:

            • 欢迎来到 Stackoverflow。请花一些时间阅读如何写一个好的答案。阅读thisthis
            【解决方案9】:

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

            【讨论】:

              猜你喜欢
              • 2012-07-04
              • 2016-06-14
              • 2010-09-27
              • 1970-01-01
              • 2018-04-20
              • 2021-11-11
              • 2021-01-13
              • 2017-01-24
              • 1970-01-01
              相关资源
              最近更新 更多