我创建了一个使用 DBMS_SCHEDULER 在数据库中成功运行的作业,但现在我需要禁用此作业,我该怎么做? 谢谢!
虽然当前的答案提供了如何禁用作业的解决方案,但我想进一步解释一下作业的创建方式会首先影响作业是否需要禁用。
我假设您正在使用
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
总结
auto_drop
和 enabled
)auto_drop
为 false ,enabled
为 true )显然,这只是您可以使用的许多选项的一组小示例
dbms_scheduler
Oracle 有一个很好的调度作业包。
在您的情况下,您需要禁用程序。 这是关于dbms_scheduler
的详细信息只需使用 oracle 新查询窗口这样调用它,您的作业将被禁用:
begin dbms_scheduler.disable('job-name'); end;
或者在命令窗口中:
exec dbms_scheduler.disable('SCHEMA_MNTC_JOB');
BEGIN
DBMS_SCHEDULER.DISABLE('name_of_your_job');
END;
/
EXEC dbms_scheduler.disable('name_of_your_job');
希望这能解决您的问题
您可以使用 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 创建了作业,您可以以相同的方式找到适当的过程。但这样的作业不能被禁用,必须将它们设置为损坏。
程序被破坏
此过程设置损坏标志。损坏的作业永远不会运行。