在同一个数据库内,被引用对象上进行了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日开课,火热报名中,名额有限,请提早预约!更多详情访问思庄网站咨询在线客服。