深入Oracle视图编写的示例(1)(2)
强制创建Oracle视图
正常情况下,如果基表不存在,创建视图就会失败。但是可以使用force选项强制创建视图(前提:创建视图的语句没有语法错误!),此时该视图处于失效状态。
示例1:
- create force view vw_test_tab
- as
- select c1,c2 from test_tab;--------会出现“警告: 创建的视图带有编译错误。”
- select object_name,status from user_objects
- where object_name='VW_TEST_TAB';--------视图状态:INVALID
- select * from vw_test_tab;--------报错
- create table test_tab--------先建表
- (c1 number(9) primary key, c2 varchar2(20),c3 varchar2(30));
- select * from vw_test_tab;--------自动编译失效的视图
- select object_name,status from user_objects
- where object_name='VW_TEST_TAB';--------视图状态:VALID
更改Oracle视图
在对视图进行更改(或重定义)之前,需要考虑如下几个问题:
之一――由于视图只是一个虚表,其中没有数据,所以更改视图只是改变数据字典中对该视图的定义信息,视图的所有基础对象都不会受到任何影响
之二――更改视图之后,依赖于该视图的所有视图和PL/SQL程序都将变为INVALID(失效)状态
之三――如果以前的视图中具有with check option选项,但是重定义时没有使用该选项,
则以前的此选项将自动删除.
更改Oracle视图的定义
方法――执行create or replace view语句。这种方法代替了先删除(“权限也将随之删除”)
后创建的方法,会保留视图上的权限,但与该视图相关的存储过程和视图会失效。
示例1:
- create or replace view v_test_tab
- as
- select c1,c2||' + '||c3 c23 from test_tab;
视图的重新编译
语法:alter view 视图名 compile;
作用:当视图依赖的基表改变后,视图会“失效”。为了确保这种改变“不影响”视图和依赖于该视图的其他对象,应该使用 alter view 语句“明确的重新编译”该视图,从而在运行视图前发现重新编译的错误。视图被重新编译后,若发现错误,则依赖该视图的对象也会失效;若没有错误,视图会变为“有效”。
权限:为了重新编译其他模式中的视图,必须拥有alter any table系统权限。
注意:当访问基表改变后的视图时,oracle会“自动重新编译”这些视图。
示例1:
- select last_ddl_time,object_name,status
- from user_objects
- where object_name='V_TEST_TAB';――视图的状态:有效
- alter table test_tab modify (c2 varchar2(30));――修改c2列的长度
- select last_ddl_time,object_name,status
- from user_objects
- where object_name='V_TEST_TAB';――视图的状态:失效
- alter view v_test_tab compile;――明确的重新编译
- select last_ddl_time,object_name,status
- from user_objects
- where object_name='V_TEST_TAB';――视图的状态:有效
思考:若上述代码修改的不是列长,而是表名,结果又会如何?
<警告:更改的视图带有编译错误;视图状态:失效>
- 上一篇:将Oracle转移到海量数据的实操
- 下一篇:Oracle缓存表学习笔记讲解