【问题标题】:How to disable a job in oracle with dbms_scheduler如何使用 dbms_scheduler 在 oracle 中禁用作业
【发布时间】:2021-10-31 16:27:25
【问题描述】:

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

【问题讨论】:

  • 你是如何创造这份工作的?你用dbms_job了吗?还是dbms_scheduler?
  • 我在 dbms_job 上创建了

标签: oracle jobs dbms-scheduler


【解决方案1】:

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

我假设您使用的是dbms_scheduler

使用auto_droptrue 和enabledtrue 创建作业

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

创建作业时,auto_drop 为 false,enabled 为 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

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

有频率的工作

这意味着该作业是根据表达式日历创建并执行的。在这种情况下,作业基于与其关联的日历表达式执行,并保持启用状态并处于 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

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

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

总结

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

显然,这只是dbms_scheduler 提供的众多选项的一小部分示例

【讨论】:

    【解决方案2】:

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

    在您的情况下,您需要禁用程序。 这里是dbms_scheduler的详细信息

    只需像这样使用 oracle 新查询窗口调用它,您的工作就会被禁用:

    begin dbms_scheduler.disable('job-name'); end;
    

    或者在命令窗口中:

    exec dbms_scheduler.disable('SCHEMA_MNTC_JOB');
    

    【讨论】:

      【解决方案3】:
      1. 您可以使用参数中的名称创建一个禁用您的作业的 PL/SQL 过程
      BEGIN
      DBMS_SCHEDULER.DISABLE('name_of_your_job');
      END;
      /
      
      1. 执行它 EXEC dbms_scheduler.disable('name_of_your_job');

      希望能解决你的问题

      【讨论】:

        猜你喜欢
        • 2016-10-09
        • 2021-01-21
        • 2018-02-17
        • 2014-11-24
        • 1970-01-01
        • 2011-09-09
        • 2017-02-22
        • 2021-11-12
        • 2014-02-04
        相关资源
        最近更新 更多