2011-01-05 19 views
1

我想用dbms_submit啓動在plsql中分離(並行)任務。 (請注意,我沒有通過我的提交調用傳遞任何間隔數據)。使用dbms_job.submit在PLSQL中提交多個作業 - 在隊列錯誤中找不到作業

在我的例子中..由於某些原因,當我試圖調用第二份工作時,我得到了一個找不到的工作。我的第二份工作任何想法都沒有被添加到工作隊列中?

​​

錯誤報告:

ORA-23421:工號154230是不是在作業隊列 ORA-06512的作業:在 「SYS.DBMS_SYS_ERROR」,行86 ORA-06512:在「 SYS.DBMS_IJOB「,行770 ORA-06512:在」SYS.DBMS_JOB「,行267 ORA-06512:在行14 23421. 00000 - 」作業編號%s不是作業隊列中的作業「 *原因:給定作業號碼的主叫方看不到任何作業。 *操作:選擇調用者可見的工作號碼。

輸出:

test1的

回答

2

如果指定NULL的作業間隔,該行爲是工作不會重新執行。一旦運行,它將從作業隊列中刪除。您也沒有指定NEXT_DATE,所以作業在提交時開始執行。執行此過程時,將創建兩個作業並立即開始執行。在第一個調用完成之前,您仍然在隊列中再次運行它,這就是第一個調用成功的原因。但是,在第二項工作運行時,它已完成提交啓動的執行,因此不再處於隊列中。這裏是你的榜樣的輕微修改說明:

DECLARE 
    jobno BINARY_INTEGER; 
    jobno2 BINARY_INTEGER; 
BEGIN 

    dbms_job.submit(jobno,'begin dbms_lock.sleep(10); dbms_output.put_line(''test1'');end;', next_date=>SYSDATE+1/24); 
    commit; 
    dbms_job.submit(jobno2,'begin dbms_lock.sleep(5); dbms_output.put_line(''test2'');end;', next_date=>SYSDATE+1/24); 
    commit; 

    dbms_output.put_line(jobno || ' ' || jobno2); 

    dbms_job.run(jobno); 
    dbms_job.run(jobno2); 
    dbms_job.run(jobno); 
END; 
/

我得到了同樣的錯誤,但要注意的輸出差異:

727 728 
test1 
test2 

在此修改示例中,作業不立即開始執行,並且RUN程序能夠執行這兩者,但只能執行一次。我第二次嘗試運行第一個作業時,由於第一次執行它而被刪除。

編輯:

我不知道你使用的是什麼版本的Oracle,但你可能要考慮的更強大DBMS_SCHEDULER package,因爲Oracle在10g版本已經取代了DBMS_JOB包吧。 DBMS_JOB是爲了向後兼容而提供的。調度器的功能的Here's a good overview

+0

+1,這是問題..提交後提交,自動運行作業..沒有明確的運行要求。 – vicsz 2011-01-06 20:44:18

3
set serveroutput on 

DECLARE  
jobno NUMBER; 
jobno2 NUMBER; 
begin 
dbms_job.submit(:jobno, 'begin dbms_lock.sleep(10); dbms_output.put_line(''test1'');end;', SYSDATE, 'SYSDATE + 1/86400', TRUE); 
commit; 
dbms_job.submit(:jobno2, 'begin dbms_lock.sleep(5); dbms_output.put_line(''test1'');end;', SYSDATE, 'SYSDATE + 1/86400', TRUE); 
commit; 
dbms_output.put_line(jobno || ' ' || jobno2); 
END; 

/