前天,有客户报说数据库在运行存储过程的时候,有时候会出现ORA-04062错误。这Oracle文档中找到这个错误的描述。sql
这个错误起源于REMOTE_DEPENDENCIES_MODE 参数,该参数用于指定数据库为远程 pl/sql 存储的过程处理被依赖对象的方式。若是设置为 timestamp,只有在服务器和本地时间戳相匹配的状况下, 才能执行该过程。若是设置为 signature,在签名安全的状况下便可执行该过程。该参数默认为timestamp。数据库
例一:timestamp安全
PROC_A (p_id IN number) /* 驻留在 DB1 */服务器
PROC_B (p_deptno IN number) /*依赖PROC_A 驻留在 DB1 */对象
PROC_C (p_ deptno IN number) /* 经过DBLINK依赖PROC_A驻留在 DB2 */文档
当PROC_A被修改或编译时,将出现编译
ORA-04062:timestamp of procedure "XXXX.PROC_A" has been changedim
PROC_B将立刻失效,PROC_C将在运行时失效,全部要正确运行,这两个过程都必须从新被编译。时间戳
要解决这个问题,能够把改参数改成signature数据
ALTER system set REMOTE_DEPENDENCIES_MODE=’SIGNATURE’scope=BOTH
例二:signature
PROC_A (p_id IN number) /* 驻留在 DB1 */
PROC_B (p_deptno IN number) /*依赖PROC_A 驻留在 DB1 */
PROC_C (p_ deptno IN number) /* 经过DBLINK依赖PROC_A驻留在 DB2 */
当PROC_A被修改或编译时,PROC_B和PROC_C建保持有效,但当PROC_A的输入参数类型发生变化时,如改成varchar2, PROC_B和PROC_C将变为无效。
或者用动态SQL在要运行该过程时修改修改
ALTER SESSION SET REMOTE_DEPENDENCIES_MODE = {SIGNATURE | TIMESTAMP}