Oracle的實體化視圖(MVIEW)的深入研究之三
Oracle的實體化視圖(MVIEW)的深入研究之三
作者: AnySQL.net, 轉載時請務必以超連結形式標明文章原始出處和作者資訊.
連結: http://www.anysql.net/oracle/star_in_mview.html
在Oracle中建立視圖時, 如果我們用了"*"符號, 會被自動地根據當時表的定義擴充成欄位列表, 在後面再加列時, 新的列不會自動出現在視圖的定義中, 直到你重建視圖為止. 那麼在MVIEW中呢, 通過一個不經意的操作, 發現一個有趣的問題. 總之, 不要隨便地在實體視圖的定義中使用"*"號.
下面我們在一個表上建兩個實體化視圖, 角本如下:
CREATE TABLE T_MVTEST AS SELECT * FROM TAB;
CREATE MATERIALIZED VIEW LOG ON T_MVTEST
WITH ROWID,SEQUENCE;
CREATE MATERIALIZED VIEW MV_TEST_STAR
REFRESH FAST WITH ROWID
AS SELECT ROWID RID, A.* FROM T_MVTEST A;
CREATE MATERIALIZED VIEW MV_TEST_NOSTAR
REFRESH FAST WITH ROWID
AS SELECT ROWID RID, A.TNAME, A.TABTYPE,
A.CLUSTERID FROM T_MVTEST A;
接下來對錶作一個增加列的操作.
SQL> ALTER TABLE T_MVTEST ADD COL4 VARCHAR2(20);
Table altered.
接下來來完全重新整理兩上實體化視圖, 看看運行情況:
SQL> EXEC DBMS_MVIEW.REFRESH('MV_TEST_STAR', 'COMPLETE');
BEGIN DBMS_MVIEW.REFRESH('MV_TEST_STAR', 'COMPLETE'); END;
*
ERROR at line 1:
ORA-12018: following error encountered during code generation for
"ANYSQL"."MV_TEST_STAR"
ORA-00904: "COL4": invalid identifier
ORA-06512: at "SYS.DBMS_SNAPSHOT", line 2255
ORA-06512: at "SYS.DBMS_SNAPSHOT", line 2461
ORA-06512: at "SYS.DBMS_SNAPSHOT", line 2430
ORA-06512: at line 1
SQL> EXEC DBMS_MVIEW.REFRESH('MV_TEST_NOSTAR', 'COMPLETE');
PL/SQL procedure successfully completed.
這是因為在進行全部方式的重新整理時, 實體化視圖的定義根據當前表的定義被展開了, 將會要重新整理新增的"COL4"這個列, 而在表"MV_TEST_STAR"中現在沒有這個例, 所以重新整理失敗, 解決的方法呢是在, 這個視圖中手工加一個列:
SQL> ALTER TABLE MV_TEST_STAR ADD COL4 NUMBER;
Table altered.
SQL> EXEC DBMS_MVIEW.REFRESH('MV_TEST_STAR', 'COMPLETE');
PL/SQL procedure successfully completed.
可以這樣解決結果還算好了.