百度了一下,有一個大佬是這樣說的: 在PL/SQL中查詢資料庫視圖時總是報告“ora-04063:view view_test has errors”的錯誤: Oracle視圖非常強大的功能之一在於其可以創建一個帶有錯誤的視圖。比如說視圖裡的欄位在基表裡不存在,該視圖仍然可以創建成功,但是非法的且無 ...
百度了一下,有一個大佬是這樣說的: 在PL/SQL中查詢資料庫視圖時總是報告“ora-04063:view view_test has errors”的錯誤: Oracle視圖非常強大的功能之一在於其可以創建一個帶有錯誤的視圖。比如說視圖裡的欄位在基表裡不存在,該視圖仍然可以創建成功,但是非法的且無法執行。當基表裡加入了該欄位,或者說某個欄位修改成視圖裡的該欄位名稱,那麼視圖馬上就可以成為合法的。 例子:
創建基表: create table v_test (name varchar2(32),age number(12));
創建帶錯誤的視圖:
create force view view_test as select name,age,address from v_test;(註意加上force選項)
由於address欄位在v_test里不存在,所以會報warning: View created with compilation errors的警告,而且執行select * from view_test;時會報“ORA-04063: view "SCOTT.VIEW_TEST" 有錯誤”的異常。
但是如果在v_test裡加上address欄位,那麼視圖就會合法。
對基表進行修改:
alter table v_test add (address varchar2(128));
現在再執行select * from view_test;就會執行成功了。 還有一個大佬是這樣解釋的:
這個錯誤發生的原因有兩種情況:
1、一種是創建的視圖本身有誤,但是通過force等命令強制創建成功了,比如視圖本身包含基表中不存在的列(或者是基於不存在的列使用了分析函數創造的列)。
解決方案:
最好不要用強制方法創建視圖,保證所用的列都是真實存在的!
2、視圖的基表,或者視圖基於其創建的視圖被刪除了。Oracle中的視圖可能會先被創建了,然後其基表或者視圖被刪除了,就會導致當前視圖產生錯誤。比如為了避免使用占空間較多的臨時表,我使用了很多視圖,然後通過視圖來實現複雜的取數,但我在刪除視圖的過程中,是按創建視圖的順序從前往後刪除的。先刪除的最後一個視圖生成時用到過的視圖,這就會導致最後一個生成的視圖是基於不存在的視圖產生的,從而是個錯誤視圖,不能查詢。
解決方案:
所以在刪除視圖時,要非常註意刪除的順序,最後需要用到的數據,最好是從視圖裡複製到有物理存儲空間的表中,再逆序刪除所有的臨時視圖。