【问题标题】:oracle 12c materialized view becomes invalid but no ddl happened to masteroracle 12c 物化视图无效但没有 ddl 发生在 master
【发布时间】:2018-02-21 19:16:26
【问题描述】:

我在我的 oracle 12c 上使用了 4 个物化视图 - 所有这些视图都是通过存储过程调用手动更新的。

所有视图都在 where 子句中包含对上下文变量的查找,包括时间跨度(从和到)。

上下文由

创建
CREATE OR REPLACE CONTEXT myContext using prepare_export;

除了使用相同的用户上下文但不同的变量名称之外,没有任何视图与其他视图有任何关系。

执行链是(应该只刷新一个视图):

execute prepare_export('MyViewName','20180131','20180231');
  1. data_export 表中的条目是为 data_export 日志生成的

    INSERT INTO DATA_EXPORT 
    (SOURCE_,EXPORT_TIME_,EXPORT_FROM_,EXPORT_TO_,user_name,user_ip) 
    VALUES (viewName,systimestamp,date_From,date_To,(select user from dual),(select sys_context('userenv','ip_address') from dual));`
    
  2. 设置上下文变量(从:20180131 到:20180231)

    dbms_session.set_context('myContext',viewName || '_from',date_from);
    dbms_session.set_context('myContext',viewName || '_to',date_to);
    
  3. 视图 MyViewName 被刷新(原子刷新 false)

    dbms_mview.refresh(viewName,'c',atomic_refresh=>FALSE);
    
  4. data_export 条目使用上次刷新的 count(*) 进行更新

    execute immediate 'UPDATE data_export set resultset_size_=' ||viewRowCount ||' where id_ = (select max(id_) from data_export where source_=''' || viewName || ''' group by source_)';
    

程序完成后,所有视图都将失效,需要手动重新编译...

有什么帮助吗?

谢谢,乔

【问题讨论】:

    标签: oracle materialized-views mv recompile


    【解决方案1】:

    我不知道。然而:

    ...所有这些都是通过存储过程调用手动更新的(...) 程序完成后,所有视图都无效,需要 手动重新编译

    您为什么不将您的手动重新编译命令包含在上述存储过程中?

    【讨论】:

    • 确保这可能有效 - 但它不能解决问题。顺便说一句 - 我已经尝试过了,但有时它不起作用 - 只有在存储过程完成几秒钟后我调用重新编译
    【解决方案2】:

    ...我将存储过程的内容缩减为仅更新一个非常简单的(选择计数(*))和新的物化视图 - 没有任何其他插入、更新、上下文...blabla

    ==> 之后所有视图都需要重新编译...

    【讨论】:

    • 好的 - 它可以通过简单的物化视图和简单的母版重现。有时视图在主 DML 发生后变得无效,有时则不会 - 这取决于之前是否完成了视图刷新并且没有发生编译......但这不是 100% 确定性......
    猜你喜欢
    • 2022-12-15
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    相关资源
    最近更新 更多