如何使用 dbms_scheduler 在 oracle 中禁用作业
Posted
技术标签:
【中文标题】如何使用 dbms_scheduler 在 oracle 中禁用作业【英文标题】:How to disable a job in oracle with dbms_scheduler 【发布时间】:2021-10-31 16:27:25 【问题描述】:我使用 DBMS_SCHEDULER 创建了一个在我的数据库中成功运行的作业,但现在我需要禁用此作业,我该怎么做? 谢谢!
【问题讨论】:
你是如何创造这份工作的?你用dbms_job
了吗?还是dbms_scheduler
?
我在 dbms_job 上创建了
【参考方案1】:
尽管当前的答案提供了如何禁用作业的解决方案,但我想更进一步,向您解释创建作业的方式会影响是否需要首先禁用作业。
我假设您使用的是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
提供的众多选项的一小部分示例
【讨论】:
【参考方案2】:Oracle 有一个很好的计划作业包。
在您的情况下,您需要禁用程序。 这里是dbms_scheduler的详细信息
只需像这样使用 oracle 新查询窗口调用它,您的工作就会被禁用:
begin dbms_scheduler.disable('job-name'); end;
或者在命令窗口中:
exec dbms_scheduler.disable('SCHEMA_MNTC_JOB');
【讨论】:
【参考方案3】:-
您可以使用参数中的名称创建一个禁用您的作业的 PL/SQL 过程
BEGIN
DBMS_SCHEDULER.DISABLE('name_of_your_job');
END;
/
-
执行它
EXEC dbms_scheduler.disable('name_of_your_job');
希望能解决你的问题
【讨论】:
以上是关于如何使用 dbms_scheduler 在 oracle 中禁用作业的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 dbms_scheduler 在 oracle 中禁用作业
如何在 Oracle 中使用 DBMS_SCHEDULER 删除文件