2017-09-21 26 views
8

我有一對夫婦的Oracle過程:如何解決ORA-27475:「JOB」必須是一個程序或鏈

create or replace procedure receive_sms (p_to_date in date) 
is 
.. 
end; 

create or replace procedure send_sms (p_date in date) 
is 
.. 
end; 

,我想創建一個基於鏈在這些程序中添加以下步驟並添加一些規則:

BEGIN 
    DBMS_SCHEDULER.CREATE_CHAIN (
    chain_name   => 'mobile_archive_chain', 
    rule_set_name   => NULL, 
    evaluation_interval => NULL, 
    comments    => NULL); 
END; 
/

--- define three steps for this chain. Referenced programs must be enabled. 
BEGIN 
DBMS_SCHEDULER.DEFINE_CHAIN_STEP('mobile_archive_chain', 'send', 'inforpilla.send_sms'); 
DBMS_SCHEDULER.DEFINE_CHAIN_STEP('mobile_archive_chain', 'receive', 'inforpilla.receive_sms'); 
END; 
/

--- define corresponding rules for the chain. 
BEGIN 
DBMS_SCHEDULER.DEFINE_CHAIN_RULE ('mobile_archive_chain', 'TRUE', 'START send'); 
DBMS_SCHEDULER.DEFINE_CHAIN_RULE ('mobile_archive_chain', 'send COMPLETED', 'Start receive'); 
DBMS_SCHEDULER.DEFINE_CHAIN_RULE ('mobile_archive_chain', 'receive COMPLETED', 'END'); 
END; 
/

--- enable the chain 
BEGIN 
DBMS_SCHEDULER.ENABLE('mobile_archive_chain'); 
END; 
/

--- create a chain job to start the chain daily at 1:00 p.m. 
BEGIN 
DBMS_SCHEDULER.CREATE_JOB (
    job_name  => 'start_archive', 
    job_type  => 'CHAIN', 
    job_action  => 'mobile_archive_chain', 
    repeat_interval => 'freq=daily;byhour=15;byminute=3;bysecond=0', 
    enabled   => TRUE); 
END; 
/

但是檢查日誌表我發現作業失敗並顯示錯誤代碼: 27475

SELECT * from USER_SCHEDULER_JOB_RUN_DETAILS ORDER BY LOG_DATE DESC 

的建議我刪除了參數形成的過程,但後來我得到這些錯誤:

CHAIN_LOG_ID="201095" 
CHAIN_LOG_ID="201095",STEP_NAME="RECEIVE", ORA-27475: "TEST.RECEIVE_SMS" must be a PROGRAM OR CHAIN 
CHAIN_LOG_ID="201095",STEP_NAME="SEND", ORA-27475: "TEST.SEND_SMS" must be a PROGRAM OR CHAIN 

回答

1

我認爲你必須使用DBMS_SCHEDULER.CREATE_PROGRAM創建一個程序對象,然後通過該對象的名字變成DBMS_SCHEDULER.DEFINE_CHAIN_STEP。它看起來像DEFINE_CHAIN_STEP的第三個參數是一個程序名稱,您可以通過調用CREATE_PROGRAM來定義該程序名稱。

手動網址:

http://docs.oracle.com/cd/E11882_01/appdev.112/e40758/d_sched.htm#ARPLS72235

5

有幾件事你需要確保:

  1. 最好在OWNER.JOBNAME中指定完整的作業名稱。看看誰是工作

    select * from dba_scheduler_jobs where lower(job_name)='start_archive'; 
    
  2. 如果開始日期和REPEAT_INTERVAL留下空的所有者,則該作業計劃儘快作業啓用運行。

  3. 作業作爲安排作業的人員運行,如果要使用當前用戶權限,則不應將作業安排爲SYS!

參考: -

Oracle Community

Ask Tom

2

問題可能是在鏈,鏈條步驟名。嘗試對所有作業,鏈和鏈步驟使用大寫或用雙引號括起名稱:「」

在oracle中,將標識符處理爲不區分大小寫並轉換爲大寫。因此,oracle無法找到你的鏈名。同樣適用於鏈式步驟,規則等

另外,在鏈式步驟調用期間,不會傳遞過程「發送」和「接收」期望參數(p_to_date)以及這些參數。這會造成問題。沒有直接的方法來傳遞鏈參數。看看這篇文章:community.oracle.com/message/1459336#1459336

+0

不這麼認爲。從文檔https://docs.oracle.com/cd/B28359_01/server.111/b28310/scheduse009。htm#ADMIN12456 –

+1

另外,連鎖調用還有另一個問題。您所期望的參數(p_to_date)和這些參數的過程在鏈式調用期間不會傳遞。這會造成問題。沒有直接的方法來傳遞鏈參數。看看這篇文章:https://community.oracle.com/message/1459336#1459336 –

相關問題