启用 Oracle 计划作业时,它是否在单独的会话中 运行?

When an Oracle Scheduled Job is Enabled, is it run in separate session?

我最近一直在学习使用 Oracle 的调度程序来异步 运行 作业。

我正在尝试构建仅 运行 一次然后自动删除的作业。

我完成此操作的方法是将作业的 MAX_RUNS 属性设置为 1,并将 AUTO_DROP 属性设置为 TRUE。

默认情况下我的所有作业都被禁用,因为我只是手动启动它们。

我注意到作业没有被删除,这 Ask Tom thread 解释了原因。

因此,如果要自动删除它们,我必须在 运行 启用它们之前先启用它们。

但是,当启用作业时,它会立即安排。

我的问题是:

启用计划作业并立即计划后,它是否在单独的会话中执行?

我需要所有作业都被异步安排,因此我希望实现与以下相同的行为:

DBMS_SCHEDULER.RUN_JOB(V_JOB_NAME, FALSE);

FALSE 表示在单独的会话中异步安排作业。

我很喜欢启用作业并立即安排它的方法,只要它在单独的会话中是异步的。

或者,如果有一种方法可以强制作业在启用时不被安排,那也可以。

我目前使用的是 Oracle 11gR2

我发现通过将新工作的 START_DATE 设置为未来的日期并将 REPEAT_INTERVAL 设置为类似 'FREQ=YEARLY' 的内容,那么该工作将不会 运行启用后立即。

虽然不理想,但这将允许在 运行 时通过 DBMS_SCEHDULER.RUN_JOB(V_JOB_NAME, FALSE) 手动删除作业;命令。

然而,这确实意味着作业计划在 运行 将来的某个时间点进行。所以不要忘记手动 运行 它。这对我来说很好,因为一切都在一次调用中发生,但很高兴调用。

如果我有一堆需要 运行 的异步一次性作业,我会认真考虑使用旧的 dbms_job 包来进行我的计划而不是 dbms_scheduler .那么你只是在做这样的事情

declare
  l_jobno pls_integer;
begin
  dbms_job.submit( l_jobno,
                   '<<what you want the job to do>>',
                   sysdate );
end;
/

这将导致在您提交 submit 后立即打开一个新会话,运行 是您指定的任何代码。它会 运行 一次,然后从 dba_jobs 中删除。

或者,我会尝试重新构建系统,以便有一个后台 "widget processor" 作业,每隔几分钟 运行 读取一个 table 以确定什么需要处理的小部件,并处理那些小部件。这可能比产生一个单独的作业来处理每个小部件更有意义。

dbms_scheduler 当你想要更复杂的处理时,一个作业依赖于另一个作业并且作业根据事件启动时,

dbms_scheduler 非常棒。但是当你只需要一个非常轻量级的框架来完成非常简单的工作时,老式 dba_jobs 会非常方便。