視圖依賴於基礎表的存在而存在,當基礎表進行了結構上的修改后,有可能會對視圖產生印象,如果要再次使用此試圖,需要進行編譯。
基礎表如下:

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