由于修改了表结构,导致视图状态变成了InValid
但是我用alter VIEW v_test COMPILE,执行成功,但是视图还是无效
一定要用这个视图的DDL语句重新执行才能有效请问这是为什么呢?为什么有的视图用Compile就可以成功,有的就不行?
在什么情况下会出现这种问题呢?

解决方案 »

  1.   

    编译视图是存在这个问题,比较奇怪,不过应该可以用dbms_ddl.alter_compile('VIEW',NULL,v_test);编译
      

  2.   

    是不是视图调用了其他视图,其他视图还是invalid。
    我也遇到过类似楼主的问题,不过那是存储过程
      

  3.   

    对于视图的修改只能用create or replace,应该没有alter view的命令
      

  4.   

    to:4楼,我开始也以为是这个原因,但是实际上我只有这一个视图有问题
    然后 alter VIEW v_test COMPILE 就是不能成功
    而用Create or Replace View v_test 的方式就完全没有问题to:5楼,alter VIEW v_test COMPILE
    这种命令是存在的另外2楼的方法还没有机会去测试
      

  5.   

    2楼的Sql在PLSQL里运行时,报无效语句错误
      

  6.   

    视图只能重建。create or replace view 
      

  7.   

    在Oracle中只能用create or replace view ,
    樓主是不是按SQL的習慣來學Oracle了?兩者是有區別的.
      

  8.   

    如果SQL没问题,直接使用Create or replace View  对视图进行重建...
      

  9.   

    汗一个,我用的就是Oracle9i
    我相信10g应该也会支持:
    alter VIEW v_test COMPILE 
    这种语法吧?反正至少9i是支持:alter VIEW v_test COMPILE 大家没有测试,没有发言权,请测试再说话,谢谢!
      

  10.   

    大部分情况下,如果因为表结构被变更,导致视图变成无效了
    用alter VIEW v_test COMPILE 基本都能变成有效
    只有极少数情况不能成功,我还不清楚具体原因另外,下面是生成所有无效的视图或存储过程等的重建语句:
    select 'alter ' ||
           DECODE(object_type, 'PACKAGE BODY', 'PACKAGE', OBJECT_TYPE) || ' ' ||
           object_name || ' COMPILE ' ||
           DECODE(object_type, 'PACKAGE BODY', ' BODY', ' ')
      from user_objects a
     where object_type in
           ('PROCEDURE', 'PACKAGE', 'FUNCTION', 'PACKAGE BODY', 'VIEW')
           and a.status <> 'VALID'