使用dbms_job.submit在PLSQL中提交多个作业 - 在队列错误中找不到作业

时间:2011-01-05 22:26:09

标签: oracle plsql

我想开始使用dbms_submit在plsql中分离(并行)任务。 (请注意,我没有通过提交调用传递任何间隔数据。)

在我的例子中......出于某种原因,当我尝试在第二个作业上调用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 个答案:

答案 0 :(得分:3)

如果为作业间隔指定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 :(得分: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;

/