2014-03-19 142 views
0

我需要将相当数量的物化视图更改为Oracle 11g上的常见视图。 我的第一种方法:ORACLE - 从物化视图创建视图

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' 
); 

每一行包含的DDL相应MVIEW,FE:

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不支持看进/快退功能,如FAS,因为我注意到:

(?=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,现在我有有效的DDL为意见。

同时,我有一个想法spontanious,只是试图

create view usual_view1 as 
select * from mat_view1; 

嗯,那工作为好,用相当少的努力。

所以我的问题:在创建视图时,是否有任何区别,通过与通常的DDL创建方式比较,从物化的视图的定义创建视图?

回答

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; 
+0

“你的观点是显示你在物化视图中保存的数据。“因为它是: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

+0

@royskatt - 我指的是您的'较少努力'方法;更新以使其更清晰。是的,第一种方法是针对底层数据;但第二种方法是针对(过时的)mview –

+0

知道了!非常感谢您的澄清! – royskatt