如果指定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。
+1,這是問題..提交後提交,自動運行作業..沒有明確的運行要求。 – vicsz 2011-01-06 20:44:18