在同一個數據庫內,被引用對象上進行了alter、drop等操做,該對象的依賴對象如view、function、procedure等,狀態會自動標記爲Invalid,再從新使用這些依賴對象時,系統會自動從新compile。sql
而一個數據庫內的對象引用了遠程數據庫的對象(這裏指程序對象,如procedure等),則遠程數據庫對象發生了變動,因爲本地數據庫並不知曉此種狀況,本地數據庫的這些對象狀態仍然爲valid,在調用這些對象時,Oracle會根據remote_dependencies_mode參數值,肯定採用timestamp或signature進行依賴性檢查。若是發現不匹配,則會直接報錯返回,同時將依賴該遠程對象的全部本地對象標記爲invalid。數據庫
經過如下測試能夠進行驗證oracle
先在遠程數據庫上建立一個測試存儲過程測試
SQL> create or replace procedure p_r_test
2 is
3 begin
4 null;
5 end;
6 /網站
Procedure created對象
而後在本地數據庫上建立兩個測試存儲過程blog
create or replace procedure p_test1
is
begin
p_r_test@testlink
end;ci
/rem
create or replace procedure p_test2
is
begin
p_r_test@testlink
end;get
/
執行一下測試程序過程
SQL> exec p_test1;
PL/SQL procedure successfully completed
查看這兩個存儲過程的狀態
SQL> select object_name,object_type,status from all_objects where object_name in (’P_TEST1′,’P_TEST2′);
OBJECT_NAME OBJECT_TYPE STATUS
-------
P_TEST1 PROCEDURE VALID
P_TEST2 PROCEDURE VALID
在遠程數據庫上從新create or replace一下程儲過程,再查看本地數據庫兩個存儲過程的狀態
SQL> select object_name,object_type,status from all_objects where object_name in (’P_TEST1′,’P_TEST2′);
OBJECT_NAME OBJECT_TYPE STATUS
-------
P_TEST1 PROCEDURE VALID
P_TEST2 PROCEDURE VALID
執行存儲過程p_test1
SQL> exec p_test1;
begin p_test1; end;
ORA-04068:已丟棄程序包的當前狀態
ORA-04062: timestamp (屬 procedure "TEST.P_R_TEST")已被更改
ORA-06512:在"TEST.P_TEST1", line 4
ORA-06512:在line 2
再看兩個存儲過程的狀態
SQL> select object_name,object_type,status from all_objects where object_name in (’P_TEST1′,’P_TEST2′);
OBJECT_NAME OBJECT_TYPE STATUS
-------
P_TEST1 PROCEDURE INVALID
P_TEST2 PROCEDURE INVALID
若是這個時候再執行p_test1,則系統發現狀態爲INVALID,會進行從新編譯。
所以在涉及到調用遠程存儲過程的本地對象,如function、package、procedure等,須要注意遠程對象變動這種狀況的發生,避免出現本地對象失效,從而引發程序問題,特別是在JOB這樣的應用中。
重慶思莊18年4月OCP認證培訓週末班正在授課,歡迎聯繫試聽!新的OCP週末班將於6月2日開課,火熱報名中,名額有限,請提早預約!更多詳情訪問思莊網站諮詢在線客服。