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作为重复类型

1
2
3
4
5
6
7
8
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,做如下查询:

wKioL1kZwkyiDAG-AABH0Hcv-vs358.png

从上面的查询可以看出,上一次执行和下一次执行的间隔大约为60s。

2、interval_clause

语法如下:

interval_clause = "INTERVAL" "=" intervalnum
   intervalnum = 1 through 99

该参数指定重复的间隔,默认为1,取值范围是1-99

示例:使用MINUTELY作为重复类型,指定间隔2分钟

1
2
3
4
5
6
7
8
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 ;
/

再次查询间隔时间

wKiom1kZw7yS4GvMAABEDdHzWvY145.png从上图中可以看出,间隔的时间约为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

1
2
3
4
5
6
7
8
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 ;
/

wKiom1kZxPLAV3J4AAA95FxLaHU807.png

从上面的查询可以看出,下次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

1
2
3
4
5
6
7
8
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 ;
/

wKioL1kZx9KA_TqJAAA8PoYFXNo579.png

从上图可以看出,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

1
2
3
4
5
6
7
8
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 ;
/

wKiom1kZ0GfQZ7UXAAA_zIBbGQM537.png

从上图可以看出一次执行时间为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

1
2
3
4
5
6
7
8
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 ;
/

wKioL1kZzCyCdvKHAAA8BIT5-VU699.png

如上图所示,下次执行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

1
2
3
4
5
6
7
8
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 ;
/

wKioL1kZzaHCkwVdAAA8MUQ_Lj0840.png

从上图可以看出,一次执行的时间为指定的5月16日1:20:30。


以上只介绍了部分参数,也只有部分参数给了示例,具体参数的使用可以在实际的生产过程中去尝试。






      本文转自hbxztc 51CTO博客,原文链接:http://blog.51cto.com/hbxztc/1926058,如需转载请自行联系原作者



相关文章
|
SQL Oracle 关系型数据库
|
关系型数据库 Oracle 存储
oracle 创建scheduler,job
1. 创建要调用的存储过程 CREATE OR REPLACE PROCEDURE INESRT_SCHEDULER_USER IS BEGIN INSERT INTO SCHEDUL...
832 0
|
SQL 监控 Oracle
关于oracle Scheduler的介绍——job
整理自君三思博客:http://blog.itpub.net/7607759/viewspace-610951 所谓出于job而胜于job,说的就是Oracle 10g后的新特性Scheduler啦。
1349 0
|
SQL 存储 Oracle
关于oracle Scheduler的介绍——Programs
整理自君三思博客:http://blog.itpub.net/7607759/viewspace-611604/ 二、使用Programs   在论坛中偶尔见过有人讨论如何在ORACLE中执行操作系统命令,或是ORACLE数据库外的应用。
1050 0
|
Oracle 关系型数据库 调度
关于oracle Scheduler的介绍——管理scheduler
整理自君三思博客:http://blog.itpub.net/7607759/viewspace-612220/ 三、使用Schedules   10g 中新推出的SCHEDULER可能确实会让很多初接触的朋友感觉晕头晕脑,相比之前的jobs,SCHEDULER中新增的概念太多。
1086 0
|
SQL 监控 Oracle
使用Toad生成Oracle Scheduler Job DDL
       最近需要在不同的数据库之前迁移Oracle scheduler job,首先想到的办法是通过datapump来直接到导出Oracle scheduler job,然后使用dump file来生成ddl文件。
1726 0
|
负载均衡 Oracle 关系型数据库
Oracle Scheduler Chain 的用法
      Oracle CHAIN,也就是链,是将一串需要完成的作业连在一起,根据每一个步骤完成的不同结果来确定下面的哪一个动作需要被完成。实际上也就是if .. then ..else。
1215 0
|
4天前
|
Oracle 数据可视化 关系型数据库
Oracle数据库安装及使用Navicat连接oracle2
Oracle数据库安装及使用Navicat连接oracle
28 1
|
13天前
|
Oracle 关系型数据库 数据库
实时计算 Flink版产品使用问题之连接到Oracle数据库但无法读取到数据,是什么导致的
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
20天前
|
SQL Oracle 关系型数据库
探索 Linux 命令 `db_archive`:Oracle 数据库归档日志的工具
探索 Linux 中的 `db_archive`,实际与 Oracle 数据库归档日志管理相关。在 Oracle 中,归档日志用于恢复,当在线重做日志满时自动归档。管理员可使用 SQL*Plus 查看归档模式,通过 `RMAN` 进行备份和恢复操作。管理归档日志需谨慎,避免数据丢失。了解归档管理对 Oracle 管理员至关重要,确保故障时能快速恢复数据库。