Oracle 10里的定时任务实现之道(oracle10定时任务)
Oracle 10里的定时任务实现之道
在Oracle 10gR2中,引入了DBMS_SCHEDULER的概念,通过这个包,可以简便地创建周期性任务和非周期性任务。DBMS_SCHEDULER的设计,使我们不需要再编写Unix脚本或者Windows批处理文件,而且具有非常详细的日志信息。本篇文章将介绍如何使用DBMS_SCHEDULER建立数据库的任务计划程序。
DBMS_SCHEDULER定义了一系列的子程序,可以通过PL/SQL或者SQL*Plus进行调用。需要注意的是,有些子程序需要在 SYSDBA 权限下才能使用,另外还需要有CREATE JOB权限。
创建Job、Program和Schedule
这里介绍最基本的三个概念:Job、Program和Schedule。Job表示一个作业或者任务,Program表示一个程序或者脚本,Schedule表示一个计划或者预定时间。
我们可以通过DBMS_SCHEDULER创建Job,Job关联一个Program和Schedule。先看下创建Program和Schedule的代码:
CREATE OR REPLACE PROGRAM myprog
AS
BEGIN
DBMS_OUTPUT.put_line(‘program start time: ‘||TO_CHAR(SYSDATE,’MM-DD-YYYY HH24:MI:SS’));
— do something here
DBMS_OUTPUT.put_line(‘program end time: ‘||TO_CHAR(SYSDATE,’MM-DD-YYYY HH24:MI:SS’));
END;
/
CREATE OR REPLACE SCHEDULE my_schedule
INTERVAL ’10’ SECOND
START DATE ’01-Jan-2015 00:00:00′
END DATE ’31-Dec-2020 23:59:59′
COMMENT ‘Test schedule’
;
在这个例子中,我们创建了一个简单的Program,输出程序开始时间和结束时间,中间放些未知的处理逻辑。我们同时也创建了一个定时器Schedule,设定了每十秒执行一次,计划执行的起始时间和结束时间。
下面是创建Job的代码:
BEGIN
DBMS_SCHEDULER.create_job(
job_name=>’test_job’,
program_name=>’myprog’,
start_date=> SYSDATE + INTERVAL ‘1’ MINUTE,
repeat_interval=> ‘FREQ=MINUTELY; INTERVAL=2’);
END;
/
在这个例子中,我们创建了一个Job,名字为test_job,关联Program名为myprog。Job会在1分钟后第一次执行,然后每两分钟重复执行。其他可用的重复间隔有FREQ=HOURLY、FREQ=DLY等等。这样我们就创建了一个周期性的定时任务,这个任务将不断地重复执行。
其他可选参数
DBMS_SCHEDULER.create_job还有其他一些参数可供选择,它们主要是关于Job如何执行和完成的。以下是一些常用的参数:
– Auto_Drop:在失败或结束后自动删除Job。默认flase。
– Enabled:是否启用从Job。默认true。
– Max_Flures:最多允许多少次失败才认为Job彻底失败,默认值为0,失败一次就视为Job执行失败。
另外,JOB_ACTION和JOB_TYPE可选项也可以在创建Job时进行指定,这些值关联Program中的作业类型和作业动作。如果不指定,Job将继承Program中的默认值。
查看和使用Job
创建Job之后,我们可以通过DBA_SCHEDULER_JOBS查看所有Job的信息。还可以调用DBMS_SCHEDULER.enable和DBMS_SCHEDULER.disable子程序以启用、禁用Job,以及通过DBMS_SCHEDULER.run_job运行指定的Job。
— 查看所有主动任务
SELECT job_name,enabled FROM dba_scheduler_jobs WHERE owner=user AND owner NOT LIKE ‘ANONYMOUS’;
— 禁用主动任务
BEGIN
DBMS_SCHEDULER.disable(‘test_job’);
END;
/
— 启用主动任务
BEGIN
DBMS_SCHEDULER.enable(‘test_job’);
END;
/
— 运行一个任务
BEGIN
DBMS_SCHEDULER.run_job(‘test_job’);
END;
/
总结
本文介绍了使用Oracle 10gR2中的DBMS_SCHEDULER创建周期性任务和非周期性任务。首先我们创建了一个Program,然后创建了一个Schedule设定了计划执行的起始时间和结束时间。接着我们创建了一个Job,关联一个Program和Schedule,设定了Job重复执行的间隔时间和Job启用和失效的时间。最后我们介绍了Job的一些可选项参数,以及如何查看和使用Job。