Отправка нескольких заданий в PLSQL с использованием dbms_job.submit - задание не найдено в ошибке очереди - PullRequest
1 голос
/ 06 января 2011

Я хочу начать отдельную (параллельную) задачу в plsql, используя dbms_submit. (Обратите внимание, что я не передаю данные интервала с моими вызовами отправки).

В моем примере .. по какой-то причине, когда я пытаюсь вызвать run на втором задании, я получаю задание, не найденное в очереди. Какие-либо идеи о моем втором задании не добавляются в очередь заданий?

set serveroutput on
DECLARE
  jobno number;
  jobno2 number;
BEGIN

  dbms_job.submit(jobno,'begin dbms_lock.sleep(10); dbms_output.put_line(''test1'');end;');
  commit;
  dbms_job.submit(jobno2,'begin dbms_lock.sleep(5); dbms_output.put_line(''test2'');end;');
  commit;

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

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

END;
/

Сообщение об ошибке:

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 не является заданием в очереди заданий» * Причина: вызывающему абоненту с заданным номером работы не видно работы. * Действие: выберите номер задания, видимый для звонящего.

Выход:

154229 154230

test1

Ответы [ 2 ]

3 голосов
/ 09 сентября 2011
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;

/
3 голосов
/ 06 января 2011

Если вы укажете 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 предоставляется для обратной совместимости. Вот хороший обзор функций планировщика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...