当系统中存在多个物化视图,使用刷新组会大大简化物化视图的刷新,只需要将同一时间同步的物化视图全都放到一个刷新组中既可。
在9i中,使用刷新组方便的时候有一个缺点,如果其中一个物化视图报错,Oracle给出的错误信息并没有说明是哪个物化视图出了问题。
这篇文章描述一种对于各种情况均适用的方法。
如何确定导致刷新组刷新失败的物化视图(一):http://yangtingkun.itpub.net/post/468/452773
上一篇介绍了本地物化视图如何定位刷新失败的物化视图,方法很简单,可惜不适用于通过数据库链建立的物化视图。
看下面的例子:
SQL> CONN YANGTK/YANGTK@YTK102已连接。
SQL> CREATE TABLE T1 (ID PRIMARY KEY, NAME) AS SELECT ROWNUM, TNAME FROM TAB;
表已创建。
SQL> CREATE TABLE T2 (ID PRIMARY KEY, NAME) AS SELECT ROWNUM, TNAME FROM TAB;
表已创建。
SQL> CREATE TABLE T3 (ID PRIMARY KEY, NAME) AS SELECT ROWNUM, TNAME FROM TAB;
表已创建。
SQL> CREATE MATERIALIZED VIEW LOG ON T1;
实体化视图日志已创建。
SQL> CREATE MATERIALIZED VIEW LOG ON T2;
实体化视图日志已创建。
SQL> CREATE MATERIALIZED VIEW LOG ON T3;
实体化视图日志已创建。
SQL> CONN YANGTK/YANGTK@YTK92已连接。
SQL> CREATE DATABASE LINK YTK102 USING 'YTK102';
数据库链接已创建。
SQL> CREATE MATERIALIZED VIEW MV_T1 REFRESH FAST AS SELECT * FROM T1@YTK102;
实体化视图已创建。
SQL> CREATE MATERIALIZED VIEW MV_T2 REFRESH FAST AS SELECT * FROM T2@YTK102;
实体化视图已创建。
SQL> CREATE MATERIALIZED VIEW MV_T3 REFRESH FAST AS SELECT * FROM T3@YTK102;
实体化视图已创建。
SQL> EXEC DBMS_REFRESH.MAKE('REP_TEST', 'MV_T1,MV_T2,MV_T3', SYSDATE 1, 'SYSDATE 1')
PL/SQL 过程已成功完成。
IXDBA.NET技术社区SQL> EXEC DBMS_REFRESH.REFRESH('REP_TEST')
PL/SQL 过程已成功完成。
SQL> CONN YANGTK/YANGTK@YTK102已连接。
SQL> ALTER TABLE T2 MODIFY NAME VARCHAR2(32);
表已更改。
SQL> INSERT INTO T1 VALUES (100, 'A');
已创建 1 行。
SQL> INSERT INTO T2 VALUES (100, RPAD('A', 32, 'A'));
已创建 1 行。
SQL> INSERT INTO T3 VALUES (100, 'A');
已创建 1 行。
SQL> COMMIT;
提交完成。
SQL> CONN YANGTK/YANGTK@YTK92已连接。
SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
会话已更改。
SQL> SELECT MVIEW_NAME, LAST_REFRESH_DATE, STALENESS FROM USER_MVIEWS;
MVIEW_NAME LAST_REFRESH_DATE STALENESS
------------------------------ ------------------- -------------------
MV_T1 2008-01-24 15:45:43 UNDEFINED
MV_T2 2008-01-24 15:45:43 UNDEFINED
MV_T3 2008-01-24 15:45:43 UNDEFINED
SQL> EXEC DBMS_REFRESH.REFRESH('REP_TEST')
BEGIN DBMS_REFRESH.REFRESH('REP_TEST'); END;
*第 1 行出现错误:
ORA-12008: 实体化视图的刷新路径中存在错误
ORA-01401: 插入的值对于列过大
ORA-06512: 在"SYS.DBMS_SNAPSHOT", line 794
ORA-06512: 在"SYS.DBMS_SNAPSHOT", line 851
ORA-06512: 在"SYS.DBMS_IREFRESH", line 683
ORA-06512: 在"SYS.DBMS_REFRESH", line 195
ORA-06512: 在line 1
SQL> SELECT MVIEW_NAME, LAST_REFRESH_DATE, STALENESS FROM USER_MVIEWS;
MVIEW_NAME LAST_REFRESH_DATE STALENESS
------------------------------ ------------------- -------------------
MV_T1 2008-01-24 15:46:34 UNDEFINED
MV_T2 2008-01-24 15:45:43 UNDEFINED