dbms_job / Oracle 作业调度程序

Posted

技术标签:

【中文标题】dbms_job / Oracle 作业调度程序【英文标题】:dbms_job / Oracle job scheduler 【发布时间】:2010-12-09 21:26:41 【问题描述】:

大家好, 我想知道您如何在 Oracle APEX 中创建作业调度程序?

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

如果你们能以我的方式提出一些建议,我将不胜感激!

干杯 丰富

【问题讨论】:

【参考方案1】:

在我看来,可能可行的最简单的解决方案是

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 来完成像这样相对简单的任务。

【讨论】:

DBMS_JOB 的一个不错的功能是您可以从表触发器创建作业 - 如果这是您的风格:)。所以调用进程只是插入工单,表上的触发器会创建一个作业来升级它。 作业应该只升级一张票还是升级所有符合特定标准的票,这是一个需要考虑的问题。该过程可以接受票证 ID 作为参数,这可能不需要特殊索引来使 escalate_cases 执行良好。【参考方案2】:

查看资料here

【讨论】:

【参考方案3】:

我已成功使用 Justin 列出的方法。另一种行之有效的方法是使用延迟交付的队列。这使您能够拥有外部寻呼程序或在队列中等待升级的东西。我对 APEX 不太熟悉,所以我不确定在这种情况下这是否是个好主意。

【讨论】:

以上是关于dbms_job / Oracle 作业调度程序的主要内容,如果未能解决你的问题,请参考以下文章

怎样在pl/sql developer中给oracle添加一个调度作业

Oracle 10g实现存储过程异步调用

查看 DBMS 作业日志 oracle

Oracle系列:触发器作业序列连接

杀死 Oracle 作业。 10g特定

如何停止 Oracle dbms_job