oracle job(定时作业)

本文介绍了如何在Oracle数据库中创建和管理定时作业,包括查询定时作业信息、创建测试表及存储过程、设置定时任务执行频率等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

--查找所有定时作业的信息
select *
--job,next_date,next_sec,failures,broken
from user_jobs



--建一张测试表

create table b(
id varchar(20),
name varchar(30),
telphone varchar(30)
);

--建一个存储过程

create or replace procedure hr_oa_b as
begin
insert into b@moa ec
select * from b eco
where not exists(
select * from b@moa ec where eco.compid=ec.compid ) ;
end;

--创建一个定时作业

variable job4 number;
begin
dbms_job.submit(:job4,'hr_oa_b;', next_date => to_date('03-11-2008 12:30:00',
'dd-mm-yyyy hh:mi:ss'),
interval => 'sysdate+1/2');  --十二个小时执行一次插入。
COMMIT;
end;

--执行定时作业
begin
dbms_job.run(:job4);
end;

--删除定时作业

begin
dbms_job.remove(:job4);
end;
<think>我们正在讨论Oracle数据库中的定时任务(Job)。用户的问题是如何禁用或删除定时任务。根据引用,Oracle有两种定时任务机制:DBMS_JOB和DBMS_SCHEDULER。我们需要分别说明这两种情况的操作方法。首先,对于DBMS_JOB(较旧的机制):-禁用(实际上是停止运行)可以通过设置`broken`标志为TRUE,这样作业就不会再运行。-删除作业可以使用`dbms_job.remove`过程。其次,对于DBMS_SCHEDULER(较新的机制,10g及以上):-禁用作业使用`dbms_scheduler.disable`过程。-删除作业使用`dbms_scheduler.drop_job`过程。此外,引用中还提到了立即运行作业和计算时间的方法,但用户的问题是关于禁用或删除,所以我们不需要立即运行。我们还需要注意,在禁用或删除之前,用户可能需要确认作业是否存在以及当前状态。因此,我们可以提供一些查询作业信息的命令。步骤:1.确定要操作的作业名称(或ID)以及它是哪种类型的作业(DBMS_JOB还是DBMS_SCHEDULER)。2.根据类型选择相应的操作命令。我们将分别给出两种机制的禁用和删除方法,并建议在操作前先查询。另外,引用[4]中提到了时间计算方式,但这里不直接相关,可以忽略。我们将按照以下结构回答:-先介绍如何查询现有的定时任务(两种类型)-然后分别说明两种类型作业的禁用和删除方法-最后,可以给出一些注意事项注意:操作定时任务需要相应的权限(如DBA权限或作业所有者权限)。根据引用[3]和[4],我们还可以补充一些关于DBMS_SCHEDULER的操作,如立即运行,但用户不需要,所以只提禁用和删除。现在,我们开始组织回答。</think>### 如何在Oracle数据库中禁用或删除定时任务(Job) 在Oracle数据库中管理定时任务(Job)时,需根据创建机制选择对应操作方式。以下是详细步骤: --- #### **一、确认任务类型** 首先需确定任务类型(`DBMS_JOB` 或 `DBMS_SCHEDULER`): ```sql -- 查询 DBMS_JOB 任务 SELECT job, what, broken FROM user_jobs; -- 查询 DBMS_SCHEDULER 任务 SELECT job_name, enabled FROM user_scheduler_jobs; ``` --- #### **二、禁用/删除 DBMS_JOB 任务** ##### **1. 禁用任务(标记为 broken)** ```sql BEGIN DBMS_JOB.BROKEN( job => 任务ID, -- 例如: 101 broken => TRUE, -- 禁用标志 next_date => NULL -- 清除下次执行时间 ); COMMIT; END; / ``` **效果**:任务保留在系统中但不再执行[^1]。 ##### **2. 永久删除任务** ```sql BEGIN DBMS_JOB.REMOVE(job => 任务ID); -- 例如: 101 COMMIT; END; / ``` **注意**:删除后不可恢复[^1]。 --- #### **三、禁用/删除 DBMS_SCHEDULER 任务** ##### **1. 禁用任务** ```sql BEGIN DBMS_SCHEDULER.DISABLE( name => '任务名称', -- 例如: 'DAILY_BACKUP_JOB' force => TRUE -- 强制停止运行中的任务 ); END; / ``` ##### **2. 永久删除任务** ```sql BEGIN DBMS_SCHEDULER.DROP_JOB( job_name => '任务名称', -- 例如: 'DAILY_BACKUP_JOB' force => TRUE -- 强制删除运行中的任务 ); END; / ``` **关键区别**:`DBMS_SCHEDULER`提供更细粒度的控制,支持强制操作[^2]。 --- #### **四、验证操作结果** ```sql -- 检查 DBMS_JOB 状态(broken=1 表示禁用) SELECT job, broken FROM user_jobs WHERE job = 任务ID; -- 检查 DBMS_SCHEDULER 状态(enabled=FALSE 表示禁用) SELECT job_name, enabled FROM user_scheduler_jobs WHERE job_name = '任务名称'; ``` --- #### **注意事项** 1. **权限要求**:需具备`CREATE JOB`权限或`DBA`角色。 2. **依赖性**:删除前确认是否有依赖对象(如调用的存储过程)。 3. **备份建议**:删除前导出任务定义: ```sql SELECT dbms_metadata.get_ddl('PROCOBJ', '任务名称') FROM dual; ``` 4. **级联影响**:`DBMS_SCHEDULER`任务关联的日志、链式任务需单独清理[^2]。 > **操作示例**:禁用ID为`101`的`DBMS_JOB`任务: > ```sql > BEGIN > DBMS_JOB.BROKEN(101, TRUE, NULL); > COMMIT; > END; > / > ``` --- ### 相关问题 1. **如何查看Oracle定时任务的历史执行记录?** (涉及`DBA_SCHEDULER_JOB_LOG`和`DBA_SCHEDULER_JOB_RUN_DETAILS`视图) 2. **定时任务执行失败时如何自动告警?** (讨论配置`DBMS_SCHEDULER`邮件通知或调用告警脚本) 3. **DBMS_JOB与DBMS_SCHEDULER在资源管理上有何差异?** (对比资源消耗、并发控制及Oracle版本兼容性[^2]) 4. **如何迁移定时任务到另一台Oracle服务器?** (涉及导出/导入元数据及依赖对象同步) [^1]: Oracle数据库数据编程SQL定时任务(Job)>。Oracle数据库提供了多种方式来实现定时任务的调度和执行,主要包括DBMS_JOB和DBMS_SCHEDULER两种机制。 [^2]: Oracle定时任务的创建与禁用/删除。目前主流的Oracle定时器有两种:DBMS_SCHEDULER和DBMS_JOB。它们之间有以下区别... [^3]: Oracle定时任务的操作命令。立即运行定时作业 -- 立即运行作业并等待它完成... [^4]: oracle暂停定时任务,Oracle定时任务。在Oracle中,sysdate - 1/6、sysdate - 1/24/60等,表示从当前时间往前推若干时间...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值