oracle scheduler(三)创建…

来源:互联网 发布:知否小说全文免费阅读 编辑:程序博客网 时间:2024/05/20 02:24

三、使用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 fromuser_scheduler_schedules;
 
      如果要修改schedule 属性的话,也是使用dbms_scheduler.set_attribute过程,该过程的调用方式前面已经多次演示过,对于schedule来说,能够修改的属性包括:repeat_interval、comments、end_date、start_date以及event_spec。

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

sql> execdbms_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_infofrom 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.csdn.net/tianlesoftware/article/details/4715218
 
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小米手机忘记小米账号密码怎么办 小米4账号密码忘了怎么办 小米2a触屏失灵怎么办 红米note5拍照不清晰怎么办 红米手机太卡怎么办 红米3x忘记密码怎么办 红米手机太卡了怎么办 红米手机太卡怎么办? 红米3老是死机怎么办 红米3s经常死机怎么办 红米4a进水了怎么办 魅族耳机声音小怎么办 魅蓝note6声音小怎么办 魅蓝3s锁定怎么办 红米1密码忘了怎么办 小米手环升级失败怎么办 红米4忘记密码怎么办 红米1代忘记密码怎么办 红米3s忘记密码怎么办 小米3卡槽卡住了怎么办 红米4手机信号不好怎么办 红米note3信号差怎么办 红米note3没信号怎么办 红米3运行慢怎么办 红米手机运行慢怎么办 红米手机忘记解锁图案怎么办 小米手机解锁图案忘了怎么办 红米2内屏坏了怎么办 红米密码忘记了怎么办 红米pro玩王者卡怎么办 红米note4不支持计步怎么办 红米pro玩游戏卡怎么办 红米手机费电快怎么办 荣耀5c忘记密码怎么办 小米之家不退货怎么办 手机号绑定过多小米账户怎么办 耐克黑色鞋褪色怎么办 买广汽传祺7s新车有问题怎么办 华为荣耀10边框掉色了怎么办 网购商家打来无货怎么办 客户拍了不发货怎么办