【问题标题】:Submitting multiple jobs in PLSQL using dbms_job.submit - Job not found in queue error使用 dbms_job.submit 在 PLSQL 中提交多个作业 - 在队列错误中找不到作业
【发布时间】:2011-01-05 22:26:09
【问题描述】:

我想开始使用 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 不是作业队列中的作业” *原因:具有给定工作编号的呼叫者看不到工作。 *Action:选择调用者可见的作业编号。

输出:

154229 154230

测试1

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    如果为作业间隔指定 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,这就是问题所在..提交后提交,自动运行作业..不需要显式运行。
    【解决方案2】:
    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;
    
    /
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-06
      • 2021-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多