Oracle的实体化视图(MVIEW)的深入研究之三
2007-09-14 09:31
525 查看
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.
可以这样解决结果还算好了.
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.
可以这样解决结果还算好了.
相关文章推荐
- Oracle的实体化视图(MVIEW)的深入研究之四
- Oracle的实体化视图(MVIEW)的深入研究之四
- Oracle的实体化视图(MVIEW)的深入研究之一
- Oracle的实体化视图(MVIEW)的深入研究之二
- Oracle的实体化视图(MVIEW)的深入研究之一
- Oracle的实体化视图(MVIEW)的深入研究之二
- Oracle的实体化视图(MVIEW)的深入研究之三
- oracle字符集深入研究
- Oracle DB 服务器 系统时间修改问题 与 SCN 关系的深入研究
- Oracle普通视图和实体化视图比较
- Oracle Internal Research深入研究Oracle内部原理
- oracle 物化视图 -循序渐进MView(三) 基于ROWID的MView
- oracle AWR深入研究分析,如何使用
- [Oracle]深入研究B-树索引
- ORACLE物化视图-循序渐进MView(五) 利用刷新组控制MView刷新
- ORACLE物化视图--实体化试图(Materialized View)介绍
- Oracle DB 服务器 系统时间修改问题 与 SCN 关系的深入研究
- oracle回滚机制深入研究
- Oracle DBLinke+实体化视图同步两个数据库的数据
- oracle 之flashback 深入研究。