共计 6033 个字符,预计需要花费 16 分钟才能阅读完成。
Oracle 11g 版本中引入了 Scheduler(调度)来取代之前版本的 JOB(任务)。这里简单介绍一下 Scheduler 中 repeat_interval 参数的含义和使用方法。
repeat_interval 从字面意思来说就是重复间隔。是指用户定义间隔多长时间执行指定的任务。如果不指定该参数,则任务只执行一次。
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
下面分别介绍几个常见的子名,更详细的信息可以参考官方文档:http://docs.oracle.com/cd/E11882_01/appdev.112/e40758/d_sched.htm#BABFBCEF
1、frequency_clause
语法如下:
frequency_clause = "FREQ" "=" (predefined_frequency | user_defined_frequency)
predefined_frequency = "YEARLY" | "MONTHLY" | "WEEKLY" | "DAILY" |
"HOURLY" | "MINUTELY" | "SECONDLY"
user_defined_frequency = named_schedule
指定重复的类型,这个参数必须指定。各个值的含意从字面就可以理解:YEARLY 指定按年重复,MONTHLY 指定按月重复,WEEKLY 指定按周重复,DAILY 指定按日重复,HOURLY 指定按小时重复,MINUTELY 指定按分钟重复,SECONDLY 指定按秒重复。
示例:使用 MINUTELY 作为重复类型
BEGIN
SYS.DBMS_SCHEDULER.CREATE_JOB(JOB_NAME =>
'tst1'
,
JOB_TYPE =>
'plsql_block'
,
JOB_ACTION =>
'insert into emp select * from scott.emp where empno=7396'
,
REPEAT_INTERVAL =>
'freq=minutely'
,
ENABLED =>
TRUE
);
END
;
/
创建一个名为 tst1 的 job,做如下查询:
从上面的查询可以看出,上一次执行和下一次执行的间隔大约为 60s。
2、interval_clause
语法如下:
interval_clause = "INTERVAL" "=" intervalnum
intervalnum = 1 through 99
该参数指定重复的间隔,默认为 1,取值范围是 1 -99
示例:使用 MINUTELY 作为重复类型,指定间隔 2 分钟
BEGIN
SYS.DBMS_SCHEDULER.CREATE_JOB(JOB_NAME =>
'tst1'
,
JOB_TYPE =>
'plsql_block'
,
JOB_ACTION =>
'insert into emp select * from scott.emp where empno=7396'
,
REPEAT_INTERVAL =>
'freq=minutely;interval=2'
,
ENABLED =>
TRUE
);
END
;
/
再次查询间隔时间
从上图中可以看出,间隔的时间约为 2 分钟。
3、bymonth_clause
语法如下:
bymonth_clause = "BYMONTH" "=" monthlist
monthlist = month ("," month)*
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"
该参数用于指定哪个月或哪几个月执行任务。可以用数字指定月份,也可以用三个字母简写指定月份。
示例:指定每 3、6、9、12 月执行 job
BEGIN
SYS.DBMS_SCHEDULER.CREATE_JOB(JOB_NAME =>
'tst1'
,
JOB_TYPE =>
'plsql_block'
,
JOB_ACTION =>
'insert into emp select * from scott.emp where empno=7396'
,
REPEAT_INTERVAL =>
'freq=monthly;bymonth=3,6,9,12'
,
ENABLED =>
TRUE
);
END
;
/
从上面的查询可以看出,下次 job 执行的时间是 17 年 6 月 15 日,因为现在是 5 月,所以 job 并没有执行。
4、byweekno_clause
byweekno_clause = "BYWEEKNO" "=" weeknumber_list
weeknumber_list = weeknumber ("," weeknumber)*
weeknumber = [minus] weekno
weekno = 1 through 53
该参数用于指定在一年中的第几周执行 job��每年有 52 或 53 周,该参数只针对 FREQ=YEARLY 有效。
5、byyearday_clause
byyearday_clause = "BYYEARDAY" "=" yearday_list
yearday_list = yearday ("," yearday)*
yearday = [minus] yeardaynum
yeardaynum = 1 through 366
该参数指定一年中的第几天执行 job,有效值为 1 -366,也可以在数字前指定 ”-“ 代表该年的倒数第几天如 ”-2″ 表示 12 月 30 日。
示例:指定每年的倒数第二天执行 job
BEGIN
SYS.DBMS_SCHEDULER.CREATE_JOB(JOB_NAME =>
'tst1'
,
JOB_TYPE =>
'plsql_block'
,
JOB_ACTION =>
'insert into emp select * from scott.emp where empno=7396'
,
REPEAT_INTERVAL =>
'freq=yearly;byyearday=-2'
,
ENABLED =>
TRUE
);
END
;
/
从上图可以看出,job 的执行时间为 17 年 12 月 30 日,即 17 年的倒数第二天。
6、bydate_clause
语法如下:
bydate_clause = "BYDATE" "=" date_list
date_list = date ("," date)*
date = [YYYY]MMDD [offset | span]
该参数用于指定哪一天执行 job,格式为 [YYYY]MMDD。可以用 span 参数指定连续的日期如 bydate=0110,0111,0112,0113,0114 与 bydate=0110+span:5d 等价。可以用 offset 参数对日期做调整,增加 / 减少几天(d) 或几周 (w) 如 bydate=0520-offset:5d,表示指定 5 月 15 日执行。
7、byday_clause
语法如下:
byday_clause = "BYDAY" "=" byday_list
byday_list = byday ("," byday)*
byday = [weekdaynum] day
weekdaynum = [minus] daynum
daynum = 1 through 53 /* if frequency is yearly */
daynum = 1 through 5 /* if frequency is monthly */
day = "MON" | "TUE" | "WED" | "THU" | "FRI" | "SAT" | "SUN"
指定一周中的周几执行 job,使用单词的前三个字母指定。如果指定的 freq=yearly,则 daynum 可以是 1 -53,指定一年的第几周。如果 freq=monthly,则 daynum 可以是 1 -5,指定一个月的第几周。使用 ”-“ 表示倒数。
示例:每个月第 3 周的周五执行 job
BEGIN
SYS.DBMS_SCHEDULER.CREATE_JOB(JOB_NAME =>
'tst1'
,
JOB_TYPE =>
'plsql_block'
,
JOB_ACTION =>
'insert into emp select * from scott.emp where empno=7396'
,
REPEAT_INTERVAL =>
'freq=monthly;byday=3 FRI'
,
ENABLED =>
TRUE
);
END
;
/
从上图可以看出一次执行时间为 17 年 5 月 19 日,为 5 月第三周的周五。
8、bymonthday_clause
语法如下:
bymonthday_clause = "BYMONTHDAY" "=" monthday_list
monthday_list = monthday ("," monthday)*
monthday = [minus] monthdaynum
monthdaynum = 1 through 31
指定每月的第几天执行 job,有效值为 1 -31,也可以使用 ”-“ 符号指定该月的倒数第几天。
示例:指定每月的倒数第二天执行 job
BEGIN
SYS.DBMS_SCHEDULER.CREATE_JOB(JOB_NAME =>
'tst1'
,
JOB_TYPE =>
'plsql_block'
,
JOB_ACTION =>
'insert into emp select * from scott.emp where empno=7396'
,
REPEAT_INTERVAL =>
'freq=hourly;bymonthday=-2'
,
ENABLED =>
TRUE
);
END
;
/
如上图所示,下次执行 job 的时间为 5 月 30 日,为 5 月的倒数第 2 天。
9、byhour_clause、byminute_clause、bysecond_clause
语法如下:
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
这些参数指定 job 执行时的具体的时、分、秒。
byhour 指定几点,byminute 指定几分,bysecond 指定几秒
示例:每天 1:20:30 执行 job
BEGIN
SYS.DBMS_SCHEDULER.CREATE_JOB(JOB_NAME =>
'tst1'
,
JOB_TYPE =>
'plsql_block'
,
JOB_ACTION =>
'insert into emp select * from scott.emp where empno=7396'
,
REPEAT_INTERVAL =>
'freq=daily;interval=1;byhour=1;byminute=20;bysecond=30'
,
ENABLED =>
TRUE
);
END
;
/
从上图可以看出,一次执行的时间为指定的 5 月 16 日 1:20:30。
以上只介绍了部分参数,也只有部分参数给了示例,具体参数的使用可以在实际的生产过程中去尝试。
更多 Oracle 相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-05/143801.htm