引用遠程數據庫對象值得注意的問題

在同一個數據庫內,被引用對象上進行了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日開課,火熱報名中,名額有限,請提早預約!更多詳情訪問思莊網站諮詢在線客服。

相關文章
相關標籤/搜索