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

问题描述 投票:0回答:4

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

oracle jobs dbms-scheduler
4个回答
9
投票

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

我假设您正在使用

dbms_scheduler

作业是使用

auto_drop
true 和
enabled
true

创建的

在这种情况下,一旦创建作业(假设您将来没有任何开始时间),作业将立即执行(因为它已启用),然后自动删除( 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_drop
    enabled
  • 如果您想运行作业并将其留在那里以便随时按需运行,但禁用。使用选项 2(
    auto_drop
    为 false ,
    enabled
    为 true )
  • 通常您会禁用频繁创建并基于某种日历表达式执行的作业。

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

dbms_scheduler


7
投票

Oracle 有一个很好的调度作业包。

在您的情况下,您需要禁用程序。 这是关于dbms_scheduler

的详细信息

只需使用 oracle 新查询窗口这样调用它,您的作业将被禁用:

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

或者在命令窗口中:

exec dbms_scheduler.disable('SCHEMA_MNTC_JOB');

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

希望这能解决您的问题


0
投票

您可以使用 DBMS_SCHEDULER 包或 DBMS_JOB 创建作业。因此,如果您使用 DBMS_SCHEDULER 包创建了它,那么您应该检查该包的手册页如何禁用作业。该文档位于PL/SQL 包和类型参考中。所有版本和功能的文档都可以在here找到。如果我在本文档中搜索“禁用”一词,第二次出现的是这个

禁用程序

禁用程序、作业、链、窗口、数据库目标、外部目标、文件观察器或组

因此,请点击文档中的链接并禁用该过程。

如果您已经熟悉 DBMS_SCHEDULER.DISABLE 过程但不记得它的参数,您可以查询数据库以获取该过程的确切签名。

打开 sqlplus 会话并找到 DBMS_SCHEDULER 包的描述

$ sqlplus user/password@database
SQL> spool desc.out
SQL> desc DBMS_SCHEDULER
     ....
SQL> spool off

在写入上述命令输出的 des.out 文件中,查找单词 DISABLE。你会发现

PROCEDURE DISABLE
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 NAME                           VARCHAR2                IN
 FORCE                          BOOLEAN                 IN     DEFAULT
 COMMIT_SEMANTICS               VARCHAR2                IN     DEFAULT

如果您使用 DBMS_JOB 创建了作业,您可以以相同的方式找到适当的过程。但这样的作业不能被禁用,必须将它们设置为损坏。

程序被破坏

此过程设置损坏标志。损坏的作业永远不会运行。

© www.soinside.com 2019 - 2024. All rights reserved.