oracle編譯物件失效
今日發現主庫使用查詢使用者查詢檢視的時候出現編譯物件失效的情況,查詢表則無此現象,在網上找到相關的解釋和解決方法
在日常資料庫維護過程中,我們會發現資料庫中一些物件(包Package、儲存過程Procedure、函式Function、檢視View、同義詞.....)會失效,呈現無效狀態(INVALID)。有時候需要定期檢查資料庫中存在哪些失效物件,對於存在異常的物件需要重新編譯,有些自動失效的物件,一般會在下次呼叫的時候,會被重新編譯,所以這些不需要人工干預。那麼為什麼物件突然會失效呢?又如何快速、高效的編譯失效物件呢?哪些失效的物件不需要我們去重新編譯呢?
資料庫物件失效原因
資料庫物件失效的原因很多,下面大致歸納了一些常見的原因(有些漏掉的,希望大家補充):
1: 當被引用物件的結構變更時,都會使得相關的依賴物件轉變為INVALID狀態。
資料庫中的物件(儲存過程,函式,包,檢視,觸發器),它們往往需要直接或者間接的引用其它物件,物件的依賴包括直接和間接二種,其中直接依賴是指儲存物件直接依賴於被引用物件,而間接依賴是指物件間接依賴於被引用物件
要檢視被引用的物件,可以透過下面SQL檢視
select * from dba_dependencies where name='&objectname';
select * from all_dependencies where name='&objectname';
select * from user_dependencies where name='&objectname';
舉個簡單例子,檢視V_TEST引用了表TEST,TEST表修改了表結構時,會導致檢視V_TEST變為無效物件。
SQL> CREATE TABLE TEST ( ID NUMBER(10));
Table created.
SQL> CREATE VIEW V_TEST AS SELECT * FROM TEST;
View created.
SQL> SELECT OBJECT_NAME, STATUS FROM DBA_OBJECTS WHERE OBJECT_NAME='V_TEST';
OBJECT_NAME STATUS
------------------- ----------------
V_TEST VALID
--修改表結構,增加一個欄位NAME後,檢視V_TEST變為無效
SQL> ALTER TABLE TEST ADD NAME VARCHAR(12);
Table altered.
SQL> SELECT OBJECT_NAME, STATUS FROM DBA_OBJECTS WHERE OBJECT_NAME='V_TEST';
OBJECT_NAME STATUS
------------------- ----------------
V_TEST INVALID
--查詢檢視V_TEST後,資料庫會重新編譯檢視
SQL> SELECT * FROM V_TEST;
no rows selected
SQL> SELECT OBJECT_NAME, STATUS FROM DBA_OBJECTS WHERE OBJECT_NAME='V_TEST';
OBJECT_NAME STATUS
------------------- ----------------
V_TEST VALID
其實不管檢視,像儲存過程,函式、包等,如果程式碼本身沒有什麼錯誤,只是引用的物件發生了變化。也會失效。但並不影響呼叫,因為ORACLE在呼叫時會自動重新編譯的,如果其它物件變化後導致編譯有錯誤。這時呼叫時重新編譯後也是錯誤並處於失效狀態,所以呼叫會出錯。
2:釋出SQL指令碼時(包、儲存過程、函式等),沒有充分測試,編譯時出錯,這時物件變為無效。
3: 資料庫升級、遷移時,出現大量無效物件(本質原因,個人臆測歸結為原因1)。
4: 諸如此類各種情況:例如,Oracle 會自動維護分割槽索引,對於全域性索引,如果在對分割槽表操作時,沒有指定update index,則會導致全域性索引失效,需要重建。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28686045/viewspace-1433945/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ORACLE編譯失效物件小結Oracle編譯物件
- oracle 失效物件自動重新編譯Oracle物件編譯
- 編譯資料庫失效物件指令碼編譯資料庫物件指令碼
- oracle編譯無效物件Oracle編譯物件
- Oracle EBS 重新編譯無效物件 invalid objectOracle編譯物件Object
- 編譯無效物件編譯物件
- Oracle查詢並批量編譯無效物件指令碼Oracle編譯物件指令碼
- 重編譯 invalid 物件編譯物件
- (轉)編譯Oracle中無效的物件的N中方法編譯Oracle物件
- 重編譯 invalid 物件(轉)編譯物件
- C++物件模型:編譯分析C++物件模型編譯
- Oracle編譯器警告Oracle編譯
- 高峰期謹慎編譯業務物件編譯物件
- 如何檢視失效的物件物件
- 建立儲存過程編譯無效物件儲存過程編譯物件
- Python 編譯:code物件 與 pyc檔案Python編譯物件
- Oracle索引失效-likeOracle索引
- 批量編譯資料庫中invalid的物件編譯資料庫物件
- oracle EBS R12 FORM 編譯OracleORM編譯
- oracle11g 編譯BBED工具Oracle編譯
- oracle11g編譯生成bbedOracle編譯
- Oracle EBS -- 編譯Form時出錯Oracle編譯ORM
- ORACLE EBS系統中的編譯Oracle編譯
- oracle 儲存過程重新編譯方法Oracle儲存過程編譯
- oracle 10g的條件編譯Oracle 10g編譯
- oracle10g bbed編譯與使用Oracle編譯
- Java編譯與反編譯Java編譯
- 今天好多人 phpstrom 編譯器註冊碼失效了,最新可用註冊碼PHP編譯
- Oracle PL/SQL編譯警告PLSQL_WARNINGSOracleSQL編譯
- 編譯oracle時報錯找不到loraolap10編譯Oracle
- 編譯編譯
- PHP MySQL (二)物件導向 增刪查改 (預編譯方式)PHPMySql物件編譯
- hadoop編譯—+2.x編譯Hadoop編譯
- gcc 編譯器與 clang 編譯器GC編譯
- 編譯器的編譯基本過程編譯
- 一張圖解析 編譯器編譯流程圖解編譯
- ubuntu下編譯交叉編譯工具鏈Ubuntu編譯
- [譯]iOS編譯器iOS編譯