【问题标题】:ORACLE - Creating view from materialized viewsORACLE - 从物化视图创建视图
【发布时间】:2014-04-25 20:50:43
【问题描述】:

我需要将大量物化视图更改为 Oracle 11g 上的常规视图。 我的第一种方法:

1.) 获取 DDL

select dbms_metadata.get_ddl(replace(object_type, ' ', '_'), object_name, owner)
from all_objects
where owner = 'MY_SCHEMA'
and object_type = 'MATERIALIZED VIEW'
and object_name in (
'MAT_VIEW1'
,'MAT_VIEW2'
,'MAT_VIEW3'
,'MAT_VIEW4'
-- ..
,'MAT_VIEW100'
); 

每一行都包含相应 MVIEW 的 DDL,f.e.:

  CREATE MATERIALIZED VIEW "MY_SCHEMA"."MVIEW1" ("ROW1", "ROW2", "ROW3")
  ORGANIZATION HEAP PCTFREE 0 PCTUSED 40 INITRANS 1 MAXTRANS 255 
  NOCOMPRESS NOLOGGING
  STORAGE(INITIAL 163840 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "MY_TABSPACE" 
  BUILD IMMEDIATE
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "MY_TABLESPACE" 
  REFRESH FORCE ON DEMAND
  WITH PRIMARY KEY USING DEFAULT LOCAL ROLLBACK SEGMENT
  USING ENFORCED CONSTRAINTS DISABLE QUERY REWRITE
  AS SELECT ROWA AS ROW1,
  ROWB AS ROW2,
  ROWC AS ROW3
  FROM MY_SCHEMA.TABLE1

2.) 使用正则表达式摆脱额外的技术配置。为方便起见,我使用 RegexBuddy 并复制粘贴文本。 Oracle 并不像我注意到的那样支持向前/向后功能:

(?=ORGANIZATION\sHEAP).+?(QUERY\sREWRITE)

结果:

  CREATE MATERIALIZED VIEW "MY_SCHEMA"."MVIEW1" ("ROW1", "ROW2", "ROW3")
  AS SELECT ROWA AS ROW1,
  ROWB AS ROW2,
  ROWC AS ROW3
  FROM MY_SCHEMA.TABLE1

最后我从每个 DDL 中删除了“MATERIALIZED”,现在我有了视图的有效 DDL。

同时我有一个自发的想法并尝试了

create view usual_view1 as
select * from mat_view1;

嗯,效果也不错,省力了很多。

所以我的问题是:与通过 DDL 创建它的通常方式相比,从 物化 视图的定义创建视图时,最终有什么不同吗?

【问题讨论】:

    标签: regex oracle view ddl materialized-views


    【解决方案1】:

    当您以第二种方式创建视图时,使用:

    create view usual_view1 as
    select * from mat_view1;
    

    ...您的视图向您显示物化视图所保存的数据,而不是基础表。因为那是refresh force on demand,您的“正常”视图只会显示物化视图持有的陈旧数据,而不是基础表中数据的当前状态。

    更重要的是,如果物化视图被删除 - 这似乎是你似乎正在替换它们 - 那么你的“正常”视图将变得无效。

    create materialized view my_mview
    refresh force on demand
    as select * from dual;
    
    materialized view MY_MVIEW created.
    
    create view my_view as select * from my_mview;
    
    view MY_VIEW created.
    
    select * from my_view;
    
    DUMMY
    -----
    X     
    
    drop materialized view my_mview;
    
    materialized view MY_MVIEW dropped.
    
    select * from my_view;
    
    SQL Error: ORA-04063: view "STACKOVERFLOW.MY_VIEW" has errors
    
    select text from user_errors where name = 'MY_VIEW';
    
    ORA-00942: table or view does not exist
    

    显然dual 仍然存在,是my_mview 再也找不到了。该视图不知道物化视图的基础表 - 它没有继承使用的查询,它只显示它包含的内容。它们是非常不同的东西。


    您可以使用 dbms_metadata.set_transform_param() 调用从 DDL 方法中消除一些噪音,但据我所知,您无法完全清除它。虽然你可以得到底层查询:

    select query
    from all_mviews where owner = 'STACKOVERFLOW'
    and mview_name = 'MY_MVIEW';
    
    QUERY                                                      
    ------------------------------------------------------------
    select * from dual                                           
    

    您可以对其进行操作以将create view ... as 放在开头;尽管querylong 列,但我认为您必须在PL/SQL 块中执行此操作,例如:

    begin
      for r in (
        select mview_name, query
        from all_mviews
        where owner = 'STACKOVERFLOW'
        and mview_name = 'MY_MVIEW'
      ) loop
        dbms_output.put_line('create or replace view '
           || replace(r.mview_name, 'MVIEW', 'VIEW')
           || ' as ' || r.query ||';');
      end loop;
    end;
    /
    
    anonymous block completed
    create or replace view MY_VIEW as select * from dual;
    

    【讨论】:

    • “您的视图正在向您显示物化视图所持有的数据。”既然是: CREATE VIEW "MY_SCHEMA"."MVIEW1" ("ROW1", "ROW2", "ROW3") AS SELECT ROWA AS ROW1, ROWB AS ROW2, ROWC AS ROW3 FROM MY_SCHEMA.TABLE1 它是指表而不是到MVIEW?!
    • @royskatt - 我指的是你的“省力”方法;更新以使其更清晰。是的,第一种方法是针对基础数据;但第二个是反对该数据的(陈旧)mview。
    • 知道了!非常感谢您的澄清!
    • @royskatt - 不过有一种更简单的方法可以获取底层查询;将其添加到答案中。
    猜你喜欢
    • 1970-01-01
    • 2015-02-11
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    • 2010-12-12
    相关资源
    最近更新 更多