視圖依賴於基礎資料表的存在而存在,當基礎資料表進行了結構上的修改後,有可能會對視圖產生印象,如果要再次使用此試圖,需要進行編譯。
基礎資料表如下:
基礎資料表
1 create table employee2 (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 number9 )
視圖
銷售人員的月薪
1 create or replace view v$employee$sales2 as3 select employ_id,family_name||first_name as employeename,salary+total_price*0.1 as salary4 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 employee2 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$sales2 as3 select employ_id,family_name||firstname as employeename,salary+total_price*0.1 as salary4 from employee e join employee_sales es on e.employ_id=es.sale_by