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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM