如何使用 dbms_scheduler 禁用 Oracle 中的作业

IT *_*ert 7 oracle jobs dbms-scheduler

我创建了一个使用 DBMS_SCHEDULER 在数据库中成功运行的作业,但现在我需要禁用该作业,我该如何执行此操作?谢谢!

Rob*_*dez 8

尽管当前的答案提供了如何禁用作业的解决方案,但我想进一步解释一下作业的创建方式会影响作业是否需要首先禁用。

我假设你正在使用dbms_scheduler.

auto_drop工作是真实创造enabled的

在这种情况下,一旦创建作业(假设您将来没有任何开始时间),作业将立即执行(因为它已启用),然后自动删除( auto_drop 为 true )

SQL> begin
DBMS_SCHEDULER.create_job
        (
                job_name             => 'MY_TEST',
                job_type             => 'PLSQL_BLOCK',
                job_action           => 'begin dbms_lock.sleep(5); end;',
                enabled              =>  TRUE ,
                auto_drop            =>  TRUE
        );
end;
/  2    3    4    5    6    7    8    9   10   11

PL/SQL procedure successfully completed.

SQL>
SQL> exec  dbms_lock.sleep(5); -- waiting 5 seconds 

PL/SQL procedure successfully completed.

SQL> select job_name,job_action from dba_scheduler_jobs where job_name = 'MY_TEST' ;

no rows selected

SQL>
Run Code Online (Sandbox Code Playgroud)

工作是用auto_dropto false 和enabledto true创建的

在这种情况下,作业会运行并自动禁用。在这种情况下,您不需要执行任何操作来禁用它。

SQL> begin
  2  DBMS_SCHEDULER.create_job
  3     (
  4             job_name             => 'MY_TEST',
  5             job_type             => 'PLSQL_BLOCK',
  6             job_action           => 'begin dbms_lock.sleep(5); end;',
  7             enabled              =>  TRUE ,
  8             auto_drop            =>  FALSE
  9     );
 10* end;
 11  /

 PL/SQL procedure successfully completed.

select job_name , state, enabled from dba_scheduler_jobs where job_name = 'MY_TEST' ;

JOB_NAME    STATE           ENABLE
----------------------------------
MY_TEST     SUCCEEDED       FALSE
Run Code Online (Sandbox Code Playgroud)

因此,如果您的作业被启用是因为它具有与其关联的日历频率,因此一旦执行,它就会状态为启用,直到下一次必须执行为止

工作频率

这意味着作业是根据表达式日历创建并执行的。在这种情况下,作业根据与其关联的日历表达式执行,并保持启用状态并处于 SCHEDULED 状态。

SQL>  exec dbms_scheduler.drop_job ( job_name => 'MY_TEST' ) ;

PL/SQL procedure successfully completed.

SQL> begin
DBMS_SCHEDULER.create_job
(job_name             => 'MY_TEST',
 job_type             => 'PLSQL_BLOCK',
 job_action           => 'begin dbms_lock.sleep(5); end;',
 enabled              =>  TRUE ,
 start_date           =>  systimestamp ,
 repeat_interval      => 'FREQ=DAILY;BYDAY=MON,TUE,WED,THU,FRI;'
 );
 end;
 / 

 PL/SQL procedure successfully completed.

SQL> select job_name , state, enabled from dba_scheduler_jobs where job_name = 'MY_TEST' ;

JOB_NAME        STATE           ENABLE
--------------------------------------
MY_TEST       SCHEDULED         TRUE
Run Code Online (Sandbox Code Playgroud)

在这种情况下,正如其他答案中指出的那样:

SQL> exec dbms_scheduler.disable ( 'MY_TEST' ) ;

PL/SQL procedure successfully completed.

SQL> select enabled  from dba_scheduler_jobs where job_name = 'MY_TEST' ;
    
ENABL
-----
FALSE
Run Code Online (Sandbox Code Playgroud)

概括

  • 如果您只想运行一次作业并将其消除,请使用选项 1(auto_drop和enabled)
  • 如果您想运行一项作业并将其留在那里以便在需要时按需运行它,但将其禁用。使用选项 2(auto_drop为 false 和enabled为 true )
  • 通常,您会禁用频繁创建并基于某种日历表达式执行的作业。

显然,这只是您可以使用的许多选项中的一组小示例dbms_scheduler


Ali*_*nli 7

Oracle 有一个很好的计划作业包。

对于您的情况,您需要禁用程序。这是关于dbms_scheduler的详细信息

只需使用 oracle new 查询窗口调用它,如下所示,您的作业将被禁用:

begin dbms_scheduler.disable('job-name'); end;
Run Code Online (Sandbox Code Playgroud)

或者在命令窗口中:

exec dbms_scheduler.disable('SCHEMA_MNTC_JOB');
Run Code Online (Sandbox Code Playgroud)


小智 3

  1. 您可以创建一个禁用您的作业的 PL/SQL 过程,其名称位于参数中
BEGIN
DBMS_SCHEDULER.DISABLE('name_of_your_job');
END;
/
Run Code Online (Sandbox Code Playgroud)
  1. 执行它 EXEC dbms_scheduler.disable('name_of_your_job');

我希望这能解决你的问题