视图依赖于基础表的存在而存在,当基础表进行了结构上的修改后,有可能会对视图产生印象,如果要再次使用此试图,需要进行编译。
基础表如下:
1 create table employee 2 ( 3 employ_id number primary key, 4 first_name nvarchar2(10), 5 last_name nvarchar2(10), 6 province varchar2(10), 7 city varchar2(10), 8 salary number 9 )
视图
1 create or replace view v$employee$sales 2 as 3 select employ_id,family_name||first_name as employeename,salary+total_price*0.1 as salary 4 from employee e join employee_sales es on e.employ_id=es.sale_by
先查看视图的状态、可用性
SELECT * FROM USER_OBJECTS WHERE OBJECT_TYPE=UPPER('VIEW') AND OBJECT_NAME =UPPER('v$employee$sales')
结果如下
可以看到状态为 VALID(可用的)
此时向表employee中添加一列Age
1 alter table employee 2 add age number
再次运行 SELECT * FROM USER_OBJECTS WHERE OBJECT_TYPE=UPPER('VIEW') AND OBJECT_NAME=UPPER('v$employee$sales')
结果如下
因为基础表的结构发生了变化,所以此时的Status状态变为INVALID(无效的)
在重新编译之前,不能使用此视图
编译视图
alter view v$employee$sales compile
再次查询其状态
再次编译后,视图状态为可用。
其实只要对视图执行一次查询,就可以将试图的状态置位可用(oracle在执行真正的查询前,会自动编译视图)
实际上,只有修改表的结构后才会影响视图的有效性,而修改表的数据不会影响视图的有效性。
但是,并非针对所有基础表的修改后,通过编译视图都可以通过。比如修改基础表的列名
alter table employee rename column first_name to firstname
查询视图状态
SELECT OBJECT_NAME,STATUS FROM USER_OBJECTS WHERE OBJECT_TYPE=UPPER('VIEW') AND OBJECT_NAME =UPPER('v$employee$sales')
编译视图 v$employee$sales
因为我们已经把first_name 修改为firstname
只有我们针对视图进行修改,才能顺利通过
1 create or replace view v$employee$sales 2 as 3 select employ_id,family_name||firstname as employeename,salary+total_price*0.1 as salary 4 from employee e join employee_sales es on e.employ_id=es.sale_by