Oracle Scheduler中的repeat_interval
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=>'insertintoempselect*fromscott.empwhereempno=7396',REPEAT_INTERVAL=>'freq=minutely',ENABLED=>TRUE); END; / 创建一个名为tst1的job,做如下查询: 从上面的查询可以看出,上一次执行和下一次执行的间隔大约为60s。 2、interval_clause 语法如下: interval_clause="INTERVAL""="intervalnum intervalnum=1through99 该参数指定重复的间隔,默认为1,取值范围是1-99 示例:使用MINUTELY作为重复类型,指定间隔2分钟 BEGIN SYS.DBMS_SCHEDULER.CREATE_JOB(JOB_NAME=>'tst1',REPEAT_INTERVAL=>'freq=minutely;interval=2',ENABLED=>TRUE); END; / 再次查询间隔时间 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',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=1through53 该参数用于指定在一年中的第几周执行job,每年有52或53周,该参数只针对FREQ=YEARLY有效。 5、byyearday_clause byyearday_clause="BYYEARDAY""="yearday_list yearday_list=yearday(","yearday)* yearday=[minus]yeardaynum yeardaynum=1through366 该参数指定一年中的第几天执行job,有效值为1-366,也可以在数字前指定"-"代表该年的倒数第几天如"-2"表示12月30日。 示例:指定每年的倒数第二天执行job BEGIN SYS.DBMS_SCHEDULER.CREATE_JOB(JOB_NAME=>'tst1',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=1through53/*iffrequencyisyearly*/ daynum=1through5/*iffrequencyismonthly*/ 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',REPEAT_INTERVAL=>'freq=monthly;byday=3FRI',ENABLED=>TRUE); END; / 从上图可以看出一次执行时间为17年5月19日,为5月第三周的周五。 8、bymonthday_clause 语法如下: bymonthday_clause="BYMONTHDAY""="monthday_list monthday_list=monthday(","monthday)* monthday=[minus]monthdaynum monthdaynum=1through31 指定每月的第几天执行job,有效值为1-31,也可以使用"-"符号指定该月的倒数第几天。 示例:指定每月的倒数第二天执行job BEGIN SYS.DBMS_SCHEDULER.CREATE_JOB(JOB_NAME=>'tst1',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=0through23 byminute_clause="BYMINUTE""="minute_list minute_list=minute(","minute)* minute=0through59 bysecond_clause="BYSECOND""="second_list second_list=second(","second)* second=0through59 这些参数指定job执行时的具体的时、分、秒。 byhour指定几点,byminute指定几分,bysecond指定几秒 示例:每天1:20:30执行job BEGIN SYS.DBMS_SCHEDULER.CREATE_JOB(JOB_NAME=>'tst1',REPEAT_INTERVAL=>'freq=daily;interval=1;byhour=1;byminute=20;bysecond=30',ENABLED=>TRUE); END; / 从上图可以看出,一次执行的时间为指定的5月16日1:20:30。 以上只介绍了部分参数,也只有部分参数给了示例,具体参数的使用可以在实际的生产过程中去尝试。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |