oracle 定时任务dbms_job 增删改查
在Oracle数据库中,DBMS_JOB
包曾经被广泛用于调度和管理数据库作业(jobs)。然而,从Oracle 11g Release 2开始,Oracle推荐使用更先进的DBMS_SCHEDULER
包来替代DBMS_JOB
,因为DBMS_SCHEDULER
提供了更丰富的功能和更好的灵活性。不过,为了回答你的问题,这里将简要介绍如何使用DBMS_JOB
进行增删改查操作。
1. 创建作业(增)
使用DBMS_JOB.SUBMIT
过程来创建作业。你需要指定作业号(如果为NULL
,Oracle会自动分配)、过程名称、开始时间、间隔时间以及参数(如果需要)。
DECLARE
job_no NUMBER;
BEGIN
DBMS_JOB.SUBMIT(
job => job_no, -- 作业号,如果为NULL,则Oracle自动分配
what => 'your_procedure;', -- 要执行的PL/SQL块或过程
next_date => SYSDATE, -- 作业下次执行的时间
interval => 'SYSDATE+1' -- 作业执行的频率(此处为每天)
);
COMMIT;
DBMS_OUTPUT.PUT_LINE('Job Number is: ' || job_no);
END;
/
注意:your_procedure
应该是一个PL/SQL过程名,不包括括号,即使过程不需要参数。
2. 修改作业(改)
DBMS_JOB
包本身没有直接修改作业(如更改执行频率或作业内容)的接口。你需要先删除旧作业,然后创建一个新的作业来替换它。
3. 删除作业(删)
使用DBMS_JOB.REMOVE
过程来删除作业。
BEGIN
DBMS_JOB.REMOVE(job_no); -- job_no 是你想要删除的作业的编号
COMMIT;
END;
/
4. 查询作业(查)
DBMS_JOB
没有直接提供查询作业信息的函数,但你可以查询USER_JOBS
、DBA_JOBS
或ALL_JOBS
视图来获取作业信息。
SELECT job, log_user, priv_user, what, next_date, interval
FROM user_jobs;
或者,如果你有足够的权限,可以查询DBA_JOBS
或ALL_JOBS
视图来获取更多信息。
替代方案:DBMS_SCHEDULER
由于DBMS_SCHEDULER
提供了更强大的功能,包括更灵活的调度、更详细的日志记录、更强大的异常处理机制等,强烈建议在新的项目中使用DBMS_SCHEDULER
来替代DBMS_JOB
。
例如,使用DBMS_SCHEDULER
创建作业的语法大致如下:
BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'my_new_job',
job_type => 'PLSQL_BLOCK',
job_action => 'BEGIN your_procedure; END;',
start_date => SYSTIMESTAMP,
repeat_interval => 'FREQ=DAILY; BYHOUR=23; BYMINUTE=0; BYSECOND=0',
enabled => TRUE,
comments => 'My daily job');
END;
/
这将创建一个每天午夜执行的作业。