前天,有客戶報說數據庫在運行存儲過程的時候,有時候會出現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}