龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 数据库类 > Oracle 技术 >

深入Oracle视图编写的示例(1)(2)

时间:2011-04-12 23:18来源:未知 作者:admin 点击:
分享到:
强制创建Oracle视图 正常情况下,如果基表不存在,创建视图就会失败。但是可以使用force选项强制创建视图(前提:创建视图的语句没有语法错误!),此时

强制创建Oracle视图

正常情况下,如果基表不存在,创建视图就会失败。但是可以使用force选项强制创建视图(前提:创建视图的语句没有语法错误!),此时该视图处于失效状态。
示例1:       

  1. create force view  vw_test_tab  
  2. as  
  3. select c1,c2 from test_tab;--------会出现“警告: 创建的视图带有编译错误。”  
  4. select object_name,status from  user_objects  
  5. where  object_name='VW_TEST_TAB';--------视图状态:INVALID  
  6. select  *  from vw_test_tab;--------报错  
  7. create table test_tab--------先建表  
  8. (c1 number(9) primary key, c2  varchar2(20),c3 varchar2(30));  
  9. select  *  from vw_test_tab;--------自动编译失效的视图  
  10. select object_name,status from  user_objects  
  11. where  object_name='VW_TEST_TAB';--------视图状态:VALID    
        

更改Oracle视图

在对视图进行更改(或重定义)之前,需要考虑如下几个问题:
之一――由于视图只是一个虚表,其中没有数据,所以更改视图只是改变数据字典中对该视图的定义信息,视图的所有基础对象都不会受到任何影响
之二――更改视图之后,依赖于该视图的所有视图和PL/SQL程序都将变为INVALID(失效)状态
之三――如果以前的视图中具有with check option选项,但是重定义时没有使用该选项,
则以前的此选项将自动删除.

更改Oracle视图的定义

方法――执行create or replace view语句。这种方法代替了先删除(“权限也将随之删除”)
后创建的方法,会保留视图上的权限,但与该视图相关的存储过程和视图会失效。
示例1:

  1. create or replace view v_test_tab  
  2. as  
  3. select c1,c2||' + '||c3  c23 from test_tab;  

视图的重新编译

语法:alter view 视图名 compile;
作用:当视图依赖的基表改变后,视图会“失效”。为了确保这种改变“不影响”视图和依赖于该视图的其他对象,应该使用 alter view 语句“明确的重新编译”该视图,从而在运行视图前发现重新编译的错误。视图被重新编译后,若发现错误,则依赖该视图的对象也会失效;若没有错误,视图会变为“有效”。
权限:为了重新编译其他模式中的视图,必须拥有alter any table系统权限。
注意:当访问基表改变后的视图时,oracle会“自动重新编译”这些视图。
示例1:

  1. select last_ddl_time,object_name,status  
  2. from  user_objects  
  3. where  object_name='V_TEST_TAB';――视图的状态:有效  
  4. alter table test_tab  modify (c2  varchar2(30));――修改c2列的长度  
  5. select last_ddl_time,object_name,status  
  6. from  user_objects  
  7. where  object_name='V_TEST_TAB';――视图的状态:失效  
  8. alter view v_test_tab compile;――明确的重新编译  
  9. select last_ddl_time,object_name,status  
  10. from    user_objects  
  11. where  object_name='V_TEST_TAB';――视图的状态:有效  

思考:若上述代码修改的不是列长,而是表名,结果又会如何?
<警告:更改的视图带有编译错误;视图状态:失效>

精彩图集

赞助商链接