oracle 视图的编译

视图依赖于基础表的存在而存在,当基础表进行了结构上的修改后,有可能会对视图产生印象,如果要再次使用此试图,需要进行编译。

基础表如下:

基础表
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

只有我们针对视图进行修改,才能顺利通过

View Code
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
原文地址:https://www.cnblogs.com/hfliyi/p/2743810.html