我认为,这种情况是因为系统对远程对象的合法性检查时用的方法为时间戳法
在sql/plus中输入命令show parameters
查看remote_dependencies_mode参数的值是不是timestamp
如果是的话,输入命令alter system set remote_dependencies_mode=signature,再重新编译你的过程

解决方案 »

  1.   

    如果可以的话,使用动态SQL,不要连接都可以编译,测试正确与否还是要连接服务器的。动态SQL很好用的,试一试。
      

  2.   

    sql的合法存在性检查。动态的执行‘alter procedure name compile;'.就可以了。
      

  3.   

    oracle中对任何对象的ddl操作都会影响到它的dependencies,比如,删除一个表,或者修改一个表的列,都会使引用到该表的其他对象如view、procedure等失效,所以要重新编译。你的情况就是这个原因。
    这一点一定要注意。
      

  4.   

    谢谢 KingSunSha(弱水三千) 
    我的存储过程写入对方SQL SERVER的表,对方只是读取,为什么会有锁住现象发生?所以我不得不DROP LINK,这样就导致了上面的情况,每次断开,需要手工编译.我的ORACEL是通过第三方软件和SQL连接的,请问有没有好的解决办法.我已经加分了
      

  5.   

    你提供的信息太少了,很难判断锁的情况怎么发生
    其他也没有什么好办法,写个脚本,把drop dblink/create dblink/recompile procedure写在一起减少一些手工操作
      

  6.   

    你提供的信息太少了,很难判断锁的情况怎么发生
    其他也没有什么好办法,写个脚本,把drop dblink/create dblink/recompile procedure写在一起减少一些手工操作
      

  7.   

    DROP DBLINK不是好办法,可以在INSERT前查询一下,如果超时,可等待一段时间,一般你这种单向插入发生锁表的情况较少,如果实时要求比较高,你就要考虑把表存在本地,用同步事务复制的办法解决可能更好些,多在你的第三方软件上找找原因,另外减少不必要的普通用户对实时表的存取.