dbms_job / Oracle作业调度程序

时间:2010-12-09 21:26:42

标签: oracle plsql scheduler oracle-apex job-scheduling

嘿伙计们, 我想知道如何在Oracle APEX中创建作业调度程序?

我正在建立一个管理呼叫的系统,每个呼叫都有一个严重级别。一小时后,应升级严重性级别。我搜索了几个小时,我想我需要创建一个定义作业调度程序然后运行更新的过程?

如果你们可以按我的方式提出一些建议,我会很感激!

干杯 富

3 个答案:

答案 0 :(得分:3)

在我看来,可能有效的最简单的解决方案就像是

CREATE PROCEDURE escalate_cases
AS
BEGIN
  UPDATE tickets
     SET status = 'ESCALATED'
   WHERE status = 'NOT ESCALATED'
     AND open_date < sysdate - interval '1' hour;
END escalate_cases;

DECLARE
  l_jobno PLS_INTEGER;
BEGIN
  dbms_job.submit( 
    l_jobno,
    'BEGIN escalate_cases(); END;',
    sysdate + interval '1' minute,
    'sysdate + interval ''1'' minute'
  );
  dbms_output.put_line( 'Job ' || l_jobno || ' submitted.' );
  commit;
END;

该过程会升级符合条件的所有票证,并且匿名块会创建一个每分钟运行一次该过程的作业。每隔一分钟(或每隔几分钟运行一次,取决于您可以等待升级票证的容忍度)的单个作业将比提交后1小时运行的每张票证的单独作业更容易管理

现在,如果您想要更复杂一点,那么DBMS_SCHEDULER包提供了DBMS_JOB包所没有的相当多的功能。它提供了一些自动日志记录,它提供链接作业的能力,定义作业执行和不运行的各种窗口(即如果在5:30创建票证,您可能不希望在6:30升级它,因为它是在数小时后)等。而DBMS_SCHEDULER是Oracle正在发展的方向。但我仍然发现自己使用DBMS_JOB来完成这样相对简单的任务。

答案 1 :(得分:1)

查看材料here

答案 2 :(得分:1)

我使用Justin列出的方法取得了很好的成功。另一种运行良好的方法是使用延迟传递的队列。这使您能够使用外部分页程序或等待队列进行升级。我对APEX并不熟悉所以我不确定在这种情况下这是不是一个好主意。