2014-03-19 162 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