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。


数据运维技术 » Oracle 10里的定时任务实现之道(oracle10定时任务)