oracle scheduler(三)创建…

本文详细介绍了Oracle 10g中Scheduler的新特性,重点讲解了如何创建和管理Schedules,包括Schedule的基本参数如START_DATE、REPEAT_INTERVAL等,并通过实例展示了如何设置执行频率和周期。同时,讨论了REPEAT_INTERVAL参数的FREQ和INTERVAL关键字,以及如何通过schedule调度Programs执行的Jobs。

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


三、使用Schedules

     10g 中的SCHEDULER 中新增的概念太多。比如说jobs,仍然可以理解成之前版本中的jobs,不过功能更加强大。

3.1 创建和管理Schedules

    Schedule,用来描述job 的执行周期。创建schedule 可以通过dbms_scheduler.create_schedule 过程,该过程支持的参数如下:

SQL>desc dbms_scheduler.create_schedule;

Parameter Type Mode Default?

--------------- ------------------------ ---- --------

SCHEDULE_NAME VARCHAR2 IN

START_DATE TIMESTAMP WITH TIME ZONE IN Y

REPEAT_INTERVAL VARCHAR2 IN

END_DATE TIMESTAMP WITH TIME ZONE IN Y

COMMENTS VARCHAR2 IN Y

各参数分别代表含意如下:

(1)SCHEDULE_NAME:指定schedule 名称,注意名称不能重复。

(2) START_DATE:指定该调度的开始时间,可为空,当为空时表示该调度暂不起用。

(3) REPEAT_INTERVAL:指定调度的执行频率或周期。

(4) END_DATE:指定调度的结束时间,可为空,为空时就表示该调度将一直进行。

(5) COMMENTS:注释信息。

       Schedules 中的REPEAT_INTERVAL 参数和Jobs 中的REPEAT_INTERVAL参数功能完全相同,甚至参数格式也一模一样。其中最重要的是FREQ 和INTERVAL 两个关键字。

(1) FREQ 关键字用来指定间隔的时间周期,可选参数有:YEARLY, MONTHLY, WEEKLY, DAILY,

HOURLY, MINUTELY, and SECONDLY,分别表示年、月、周、日、时、分、秒等单位。

(2) INTERVAL 关键字用来指定间隔的频繁,可指定的值的范围从1-99。

比如说, 当指定REPEAT_INTERVAL=>'FREQ=DAILY;INTERVAL=1';就表示每天执行一次, 如果将INTERVAL 改为7 就表示每7 天执行一次,效果等同于FREQ=WEEKLY;INTERVAL=1。

下面,创建一个schedule,指定调度为每周一次的频率,执行脚本如下:

SQL> BEGIN

DBMS_SCHEDULER.CREATE_SCHEDULE (

schedule_name => 'MySchedule',

start_date => SYSDATE,

repeat_interval => 'FREQ=WEEKLY; INTERVAL=1',

comments => 'Every 1 weeks');

END;

/
 
       查询当前已经创建的schedules,可以通过*_SCHEDULER_SCHEDULES 视图(含DBA_,ALL_,USER_),例如,查看当前用户拥有的schedules,执行语句如下:

SQL> select schedule_name,repeat_interval from user_scheduler_schedules;
 
       如果要修改schedule 属性的话,也是使用dbms_scheduler.set_attribute 过程,该过程的调用方式前面已经多次演示过,对于schedule 来说,能够修改的属性包括:repeat_interval、comments、end_date、start_date 以及event_spec。

       删除schedule,执行DBMS_SCHEDULER.DROP_SCHEDULE 过程即可,如:

sql> exec dbms_scheduler.drop_schedule('my_first_schedule');

pl/sql procedure successfully completed.

3.2 Schedules调度Programs执行的Jobs

       通过schedule 调度program 的执行的job。下面我们通过实例来演示,如何创建通过schedule 调度program 的执行的job 。

1. 我们用前面创建的Program:IPCONFIG,执行操作系统命令ipconfig。(创建的IPCONFIG:参见上篇博文)

2. 用我们刚创建的schedule:MySchedule

3. 创建job,按照指定的schedule,执行program,操作如下:

SQL> BEGIN

DBMS_SCHEDULER.CREATE_JOB (

job_name => 'ExecCmd',

program_name => 'IPCONFIG',

schedule_name => 'MySchedule',

enabled => true);

END;

/

       创建job 时,start_date,repeat_interval,job_action 等均无须指定,因为这些参数将由program 和schedule 来控制。这样,操作完成后,ORACLE 就会自动定时(当前设置为每周执行一次)program 中定义的操作。

       要查看当前的执行情况,通过*_scheduler_job_run_details 即可查询(*_scheduler_job_log 也可以,不过该视图中信息不如detail 中全面)。例如,查看刚刚创建的"ExecCmd"任务的执行情况,执行命令如下:

SQL> select log_id,log_date,status,additional_info from user_scheduler_job_run_details where job_name = 'ExecCmd';

3.3 设置Repeat Interval

       Job 和Schedule 中REPEAT_INTERVAL 参数都是用来控制执行的频率或周期,虽然说周期是一个时间性概念,不过REPEAT_INTERVAL 指定的时候并不是一个时间值,而是由一组关键字描述的时间。

       前面介绍Job 和Schedule 的REPEAT_INTERVAL 参数时,提到该参数拥有FREQ 以及INTERVAL 两个关键字,其实除此之外,还有如BYMONTH、BYWEEKNO、BYYEARDAY、BYDATE 等等参数,可以用来进行更精确的定义,比如通过BYMONTH 关键字指定调度运行的月份,BYDAY 指定调度在哪天运行等等。

REPEAT_INTERVAL 参数的详细语法如下:

repeat_interval = regular_schedule | combined_schedule

==============================

regular_schedule = frequency_clause

[";" interval_clause] [";" bymonth_clause] [";" byweekno_clause]

[";" byyearday_clause] [";" bydate_clause] [";" bymonthday_clause]

[";" byday_clause] [";" byhour_clause] [";" byminute_clause]

[";" bysecond_clause] [";" bysetpos_clause] [";" include_clause]

[";" exclude_clause] [";" intersect_clause][";" periods_clause]

[";" byperiod_clause]

==============================

combined_schedule = schedule_list [";" include_clause]

[";" exclude_clause] [";" intersect_clause]

frequency_clause = "FREQ" "=" ( predefined_frequency | user_defined_frequency )


predefined_frequency = "YEARLY" | "MONTHLY" | "WEEKLY" | "DAILY" |

"HOURLY" | "MINUTELY" | "SECONDLY"


user_defined_frequency = named_schedule

==============================

interval_clause = "INTERVAL" "=" intervalnum

intervalnum = 1 through 99


bymonth_clause = "BYMONTH" "=" monthlist

monthlist = monthday ( "," monthday)*

month = numeric_month | char_month

numeric_month = 1 | 2 | 3 ... 12

char_month = "JAN" | "FEB" | "MAR" | "APR" | "MAY" | "JUN" |

"JUL" | "AUG" | "SEP" | "OCT" | "NOV" | "DEC"


byweekno_clause = "BYWEEKNO" "=" weeknumber_list

weeknumber_list = weeknumber ( "," weeknumber)*

weeknumber = [minus] weekno

weekno = 1 through 53


byyearday_clause = "BYYEARDAY" "=" yearday_list

yearday_list = yearday ( "," yearday)*

yearday = [minus] yeardaynum

yeardaynum = 1 through 366


bydate_clause = "BYDATE" "=" date_list

date_list = date ( "," date)*

date = [YYYY]MMDD [ offset | span ]


bymonthday_clause = "BYMONTHDAY" "=" monthday_list

monthday_list = monthday ( "," monthday)*

monthday = [minus] monthdaynum

monthdaynum = 1 through 31


byday_clause = "BYDAY" "=" byday_list

byday_list = byday ( "," byday)*

byday = [weekdaynum] day

weekdaynum = [minus] daynum

daynum = 1 through 53

daynum = 1 through 5

day = "MON" | "TUE" | "WED" | "THU" | "FRI" | "SAT" | "SUN"


byhour_clause = "BYHOUR" "=" hour_list

hour_list = hour ( "," hour)*

hour = 0 through 23


byminute_clause = "BYMINUTE" "=" minute_list

minute_list = minute ( "," minute)*

minute = 0 through 59


bysecond_clause = "BYSECOND" "=" second_list

second_list = second ( "," second)*

second = 0 through 59


bysetpos_clause = "BYSETPOS" "=" setpos_list

setpos_list = setpos ("," setpos)*

setpos = [minus] setpos_num

setpos_num = 1 through 9999

==============================

include_clause = "INCLUDE" "=" schedule_list

exclude_clause = "EXCLUDE" "=" schedule_list

intersect_clause = "INTERSECT" "=" schedule_list

schedule_list = schedule_clause ("," schedule_clause)*

schedule_clause = named_schedule [ offset ]

named_schedule = [schema "."] schedule

periods_clause = "PERIODS" "=" periodnum

byperiod_clause = "BYPERIOD" "=" period_list

period_list = periodnum ("," periodnum)*

periodnum = 1 through 100

==============================

offset = (" " | "-") ["OFFSET:"] duration_val

span = (" " | "-" | "^") "SPAN:" duration_val

duration_val = dur-weeks | dur_days

dur_weeks = numofweeks "W"

dur_days = numofdays "D"

numofweeks = 1 through 53

numofdays = 1 through 376

minus = "-"


例如:设置任务仅在周5 的时候运行:

REPEAT_INTERVAL => 'FREQ=DAILY; BYDAY=FRI';

REPEAT_INTERVAL => 'FREQ=WEEKLY; BYDAY=FRI';

REPEAT_INTERVAL => 'FREQ=YEARLY; BYDAY=FRI';

 
设置任务隔一周运行一次,并且仅在周5 运行:

REPEAT_INTERVAL => 'FREQ=WEEKLY; INTERVAL=2; BYDAY=FRI';


设置任务在当月最后一天运行:

REPEAT_INTERVAL => 'FREQ=MONTHLY; BYMONTHDAY=-1';


设置任务在3 月10 日运行:

REPEAT_INTERVAL => 'FREQ=YEARLY; BYMONTH=MAR; BYMONTHDAY=10';

REPEAT_INTERVAL => 'FREQ=YEARLY; BYDATE=0310';

上述两条语句功能相同。


设置任务每10 隔天运行:

REPEAT_INTERVAL => 'FREQ=DAILY; INTERVAL=10';

 
设置任务在每天的下午4、5、6 点时运行:

REPEAT_INTERVAL => 'FREQ=DAILY; BYHOUR=16,17,18';

 
设置任务在每月29 日运行:

REPEAT_INTERVAL => 'FREQ=MONTHLY; BYMONTHDAY=29';

 
设置任务在每年的最后一个周5 运行:

REPEAT_INTERVAL => 'FREQ=YEARLY; BYDAY=-1FRI';

 
设置任务每隔50 个小时运行:

REPEAT_INTERVAL => 'FREQ=HOURLY; INTERVAL=50';


       注意:SCHEDULER 中的REPEAT_INTERVAL 也完全可以按照以前Job方式设置, REPEAT_INTERVAL实际上是指定周期,直接指定一个时间值,当然也是周期。

       比如说,设置任务每天执行一次,也可以设置REPEAT_INTERVAL 参数值如下:

REPEAT_INTERVAL => 'trunc(sysdate) 1'

 

又比如设置任务每周执行一次:

REPEAT_INTERVAL => 'trunc(sysdate) 7'

       不过需要注意,这种方式仅用于创建SCHEDULER 中jobs 时使用,不能用于schedule。

 
转自:http://blog.youkuaiyun.com/tianlesoftware/article/details/4715218
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值