Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103678484
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: Oracle

2008-05-23 13:15:43

  来源: 作者:AnySQL.net

在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.

    可以这样解决结果还算好了.

阅读(300) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~