前天,有客户报说数据库在运行存储过程的时候,有时候会出现ORA-04062错误。这Oracle文档中找到这个错误的描述。
这个错误起源于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 changed
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 =
领取专属 10元无门槛券
私享最新 技术干货