zoukankan      html  css  js  c++  java
  • 在Oracle中创建视图时, 如果我们用了”*”符号

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

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

    魔兽就是毒瘤,大家千万不要玩。
  • 相关阅读:
    日期间隔之年、月、日、时、分、秒
    加减年、月、日、时、分、秒
    求总和的百分比
    返回最值所在行数据
    返回各部门工资排名前三位的员工
    生成累计和
    将字符和数字数据分离
    从字符串中删除不需要的字符
    计算字符在字符串中出现的次数
    字符串文字中包含引号
  • 原文地址:https://www.cnblogs.com/tracy/p/2150247.html
Copyright © 2011-2022 走看看