引用远程数据库对象值得注意的问题

在同一个数据库内,被引用对象上进行了alter、drop等操作,该对象的依赖对象如view、function、procedure等,状态会自动标记为Invalid,再重新使用这些依赖对象时,系统会自动重新compile。

而一个数据库内的对象引用了远程数据库的对象(这里指程序对象,如procedure等),则远程数据库对象发生了变更,由于本地数据库并不知晓此种情况,本地数据库的这些对象状态仍然为valid,在调用这些对象时,Oracle会根据remote_dependencies_mode参数值,确定采用timestamp或signature进行依赖性检查。如果发现不匹配,则会直接报错返回,同时将依赖该远程对象的所有本地对象标记为 invalid。

通过以下测试可以进行验证
先在远程数据库上创建一个测试存储过程

SQL> create or replace procedure p_r_test
2 is
3 begin
4 null;
5 end;
6 /

Procedure created[@more@]然后在本地数据库上创建两个测试存储过程

create or replace procedure p_test1
is
begin
p_r_test@testlink
end;

/

create or replace procedure p_test2
is
begin
p_r_test@testlink
end;

/

执行一下测试程序过程

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这样的应用中。

摘自:http://www.laoxiong.net/category/oracle/oraman/page/5

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/678020/viewspace-1043716/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/678020/viewspace-1043716/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值