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如何刷新物化视图的主要内容,如果未能解决你的问题,请参考以下文章