Если вы укажете 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 может выполнить оба, но только один раз. Во второй раз, когда я пытаюсь запустить первое задание, оно было удалено из-за первого его выполнения.
EDIT:
Я не знаю, какую версию Oracle вы используете, но вы, возможно, захотите взглянуть на гораздо более надежный пакет DBMS_SCHEDULER , поскольку Oracle заменил пакет DBMS_JOB на него в версии 10g. DBMS_JOB предоставляется для обратной совместимости. Вот хороший обзор функций планировщика.