如何在 window 中安排 Oracle DBMS 作业
How to schedule Oracle DBMS Jobs in a window
我想创建一个 Oracle DBMS 作业,从 09:00 到 20:00 每 10 分钟每个工作日(不是周末)运行。我想知道我是否可以在作业定义的 FREQ
参数中这样做,或者我必须创建一个 New Maintenance Window
.
似乎在提出的解决方案中,作业 运行 仅在 9 和 20,并且在第一次执行后,当我 运行 这个查询
select owner, job_name, next_run_date
from dba_scheduler_jobs
where JOB_NAME = 'GET_INVOICES_JOB';
我得到了09/10/17 20:01:27,000000000 EUROPE/MADRID
'freq=minutely; interval=10; byhour=9,20; byday=MON,TUE,WED,THU,FRI; exclude=Company_Holidays; bysetpos=-1'
你可以使用这个:
begin
dbms_scheduler.create_job (
job_name => 'jb_en_lopes',
job_type => 'STORED_PROCEDURE',
job_action => 'pr_en_lopes',
start_date => '09-oct-2017 09:00:00 am',
repeat_interval => 'freq=minutely; interval=10; byhour=9,10,11,12,13,14,15,16,17,18,19,20; byday=MON,TUE,WED,THU,FRI;',
enabled => true);
end;
当这个调度程序负责时,我得到以下结果:
select *
from dba_scheduler_job_log l
where l.job_name = 'JB_EN_LOPES'
order by l.log_date desc;
LOG_ID LOG_DATE OPERATION STATUS
1051594 10-OCT-17 09.59.01.197420 AM +03:00 RUN SUCCEEDED
1051592 10-OCT-17 09.58.02.229724 AM +03:00 RUN SUCCEEDED
1051590 10-OCT-17 09.57.03.177907 AM +03:00 RUN SUCCEEDED
1051588 10-OCT-17 09.56.01.197341 AM +03:00 RUN SUCCEEDED
其中:
select owner, job_name, next_run_date
from dba_scheduler_jobs
where JOB_NAME = 'JB_EN_LOPES';
OWNER JOB_NAME NEXT_RUN_DATE
myschema JB_EN_LOPES 10-OCT-17 08.00.00.194958 PM +03:00
更新:
如果您无权访问 dba_
视图,请考虑将这些前缀替换为 user_
,并从最后一个 select 列表中删除 owner
列查询为
select job_name, next_run_date
from user_scheduler_jobs
where JOB_NAME = 'JB_EN_LOPES';
我认为这不可能:
以下是一些 repeat_interval 示例,展示了日历语法的多功能性和灵活性:
运行 周一至周五每天 10:00 下午:
FREQ=DAILY; BYDAY=MON,TUE,WED,THU,FRI; BYHOUR=22; BYMINUTE=0; BYSECOND=0;
运行 每小时:
FREQ=HOURLY;INTERVAL=1;
运行 每 5 分钟:
FREQ=MINUTELY;INTERVAL=5;
运行 每周五 9:00 上午(所有三个示例都是等效的):
FREQ=DAILY; BYDAY=FRI; BYHOUR=9; BYMINUTE=0; BYSECOND=0;
FREQ=WEEKLY; BYDAY=FRI; BYHOUR=9; BYMINUTE=0; BYSECOND=0;
FREQ=YEARLY; BYDAY=FRI; BYHOUR=9; BYMINUTE=0; BYSECOND=0;
运行 每隔一个星期五:
FREQ=WEEKLY; INTERVAL=2; BYDAY=FRI;
运行 每年第 5、10 和 15 周的星期一:
FREQ=YEARLY; BYWEEKNO=5,10,15; BYDAY=MON
运行 每个月的最后一天。
FREQ=MONTHLY; BYMONTHDAY=-1;
运行 每个月的倒数第二天:
FREQ=MONTHLY; BYMONTHDAY=-2;
运行3月10日(两个例子等价):
FREQ=YEARLY; BYMONTH=MAR; BYMONTHDAY=10;
FREQ=YEARLY; BYDATE=0310;
运行每年1月10日、11日、12日、13日和14日(两个例子等同):
FREQ=YEARLY; BYDATE=0110,0111,0112,0113,0114
FREQ=YEARLY; BYDATE=0110+SPAN:5D;
运行 每 10 天:
FREQ=DAILY; INTERVAL=10;
运行 每天 4:15、5:15 和 6:15PM:
FREQ=DAILY; BYHOUR=16,17,18; BYMINUTE=15; BYSECOND=0;
运行每隔一个月的第15天:
FREQ=MONTHLY; INTERVAL=2; BYMONTHDAY=15;
运行每月29号:
FREQ=MONTHLY; BYMONTHDAY=29;
运行 每个月的第二个星期三:
FREQ=MONTHLY; BYDAY=2WED;
运行一年的最后一个星期五:
FREQ=YEARLY; BYDAY=-1FRI;
运行 每 50 小时:
FREQ=HOURLY; INTERVAL=50;
运行 每隔一个月的最后一天:
FREQ=MONTHLY; INTERVAL=2; BYMONTHDAY=-1;
运行 每个月的前三天每小时:
FREQ=HOURLY; BYMONTHDAY=1,2,3;
运行每年的第60天、第120天和第180天:
FREQ=YEARLY; BYYEARDAY=60,120,180;
运行 每个月的最后一个工作日(假设工作日为周一至周五):
FREQ=MONTHLY; BYDAY=MON,TUE,WED,THU,FRI; BYSETPOS=-1
这里有一些更复杂的例子,它们引用了以下命名的时间表:
BEGIN
sys.DBMS_SCHEDULER.create_schedule (
schedule_name => 'COMPANY_HOLIDAYS',
repeat_interval => 'FREQ=YEARLY; BYDATE=0704,0905,1124,1125,1225;');
sys.DBMS_SCHEDULER.create_schedule (
schedule_name => 'JUL4',
repeat_interval => 'FREQ=YEARLY; BYMONTH=JUL; BYMONTHDAY=4;');
sys.DBMS_SCHEDULER.create_schedule (
schedule_name => 'MEM',
repeat_interval => 'FREQ=YEARLY; BYMONTH=MAY; BYMONTHDAY=30;');
sys.DBMS_SCHEDULER.create_schedule (
schedule_name => 'LAB',
repeat_interval => 'FREQ=YEARLY; BYMONTH=SEP; BYMONTHDAY=5;');
sys.DBMS_SCHEDULER.create_schedule (
schedule_name => 'LAST_SAT',
repeat_interval => 'FREQ=MONTHLY; BYDAY=SAT; BYSETPOS=-1;');
sys.DBMS_SCHEDULER.create_schedule (
schedule_name => 'END_QTR',
repeat_interval => 'FREQ=YEARLY; BYDATE=0331,0630,0930,1231;');
sys.DBMS_SCHEDULER.create_schedule (
schedule_name => 'FISCAL_YEAR',
repeat_interval => 'FREQ=YEARLY;BYDATE=0301,0601,0901,1201;PERIODS=4;');
END;
/
运行每月最后一个工作日,不包括公司假期:
频率=每月;白天=周一、周二、周三、周四、周五;排除=COMPANY_HOLIDAYS; BYSETPOS=-1
运行每周五中午及公司假期:
频率=每年;白天=星期五;下班时间=12;包括=COMPANY_HOLIDAYS
运行 这三个假期:7 月 4 日、阵亡将士纪念日和劳动节:
7 月 4 日,MEM,实验室
运行 在该月的最后一天(星期六或季度的最后一天):
FREQ=MONTHLY; BYMONTHDAY=-1; INTERSECT=LAST_SAT,END_QTR
运行财政年度每个季度的最后一个星期三:
FREQ=FISCAL_YEAR;BYDAY=-1WED
运行会计年度第2、4季度的最后一个工作日(假设工作日为周一至周五):
FREQ=FISCAL_YEAR;BYDAY=MON,TUE,WED,THU,FRI;BYPERIOD=2,4;BYSETPOS=-1
我想创建一个 Oracle DBMS 作业,从 09:00 到 20:00 每 10 分钟每个工作日(不是周末)运行。我想知道我是否可以在作业定义的 FREQ
参数中这样做,或者我必须创建一个 New Maintenance Window
.
似乎在提出的解决方案中,作业 运行 仅在 9 和 20,并且在第一次执行后,当我 运行 这个查询
select owner, job_name, next_run_date
from dba_scheduler_jobs
where JOB_NAME = 'GET_INVOICES_JOB';
我得到了09/10/17 20:01:27,000000000 EUROPE/MADRID
'freq=minutely; interval=10; byhour=9,20; byday=MON,TUE,WED,THU,FRI; exclude=Company_Holidays; bysetpos=-1'
你可以使用这个:
begin
dbms_scheduler.create_job (
job_name => 'jb_en_lopes',
job_type => 'STORED_PROCEDURE',
job_action => 'pr_en_lopes',
start_date => '09-oct-2017 09:00:00 am',
repeat_interval => 'freq=minutely; interval=10; byhour=9,10,11,12,13,14,15,16,17,18,19,20; byday=MON,TUE,WED,THU,FRI;',
enabled => true);
end;
当这个调度程序负责时,我得到以下结果:
select *
from dba_scheduler_job_log l
where l.job_name = 'JB_EN_LOPES'
order by l.log_date desc;
LOG_ID LOG_DATE OPERATION STATUS
1051594 10-OCT-17 09.59.01.197420 AM +03:00 RUN SUCCEEDED
1051592 10-OCT-17 09.58.02.229724 AM +03:00 RUN SUCCEEDED
1051590 10-OCT-17 09.57.03.177907 AM +03:00 RUN SUCCEEDED
1051588 10-OCT-17 09.56.01.197341 AM +03:00 RUN SUCCEEDED
其中:
select owner, job_name, next_run_date
from dba_scheduler_jobs
where JOB_NAME = 'JB_EN_LOPES';
OWNER JOB_NAME NEXT_RUN_DATE
myschema JB_EN_LOPES 10-OCT-17 08.00.00.194958 PM +03:00
更新:
如果您无权访问 dba_
视图,请考虑将这些前缀替换为 user_
,并从最后一个 select 列表中删除 owner
列查询为
select job_name, next_run_date
from user_scheduler_jobs
where JOB_NAME = 'JB_EN_LOPES';
我认为这不可能:
以下是一些 repeat_interval 示例,展示了日历语法的多功能性和灵活性:
运行 周一至周五每天 10:00 下午:
FREQ=DAILY; BYDAY=MON,TUE,WED,THU,FRI; BYHOUR=22; BYMINUTE=0; BYSECOND=0;
运行 每小时:
FREQ=HOURLY;INTERVAL=1;
运行 每 5 分钟:
FREQ=MINUTELY;INTERVAL=5;
运行 每周五 9:00 上午(所有三个示例都是等效的):
FREQ=DAILY; BYDAY=FRI; BYHOUR=9; BYMINUTE=0; BYSECOND=0;
FREQ=WEEKLY; BYDAY=FRI; BYHOUR=9; BYMINUTE=0; BYSECOND=0;
FREQ=YEARLY; BYDAY=FRI; BYHOUR=9; BYMINUTE=0; BYSECOND=0;
运行 每隔一个星期五:
FREQ=WEEKLY; INTERVAL=2; BYDAY=FRI;
运行 每年第 5、10 和 15 周的星期一:
FREQ=YEARLY; BYWEEKNO=5,10,15; BYDAY=MON
运行 每个月的最后一天。
FREQ=MONTHLY; BYMONTHDAY=-1;
运行 每个月的倒数第二天:
FREQ=MONTHLY; BYMONTHDAY=-2;
运行3月10日(两个例子等价):
FREQ=YEARLY; BYMONTH=MAR; BYMONTHDAY=10;
FREQ=YEARLY; BYDATE=0310;
运行每年1月10日、11日、12日、13日和14日(两个例子等同):
FREQ=YEARLY; BYDATE=0110,0111,0112,0113,0114
FREQ=YEARLY; BYDATE=0110+SPAN:5D;
运行 每 10 天:
FREQ=DAILY; INTERVAL=10;
运行 每天 4:15、5:15 和 6:15PM:
FREQ=DAILY; BYHOUR=16,17,18; BYMINUTE=15; BYSECOND=0;
运行每隔一个月的第15天:
FREQ=MONTHLY; INTERVAL=2; BYMONTHDAY=15;
运行每月29号:
FREQ=MONTHLY; BYMONTHDAY=29;
运行 每个月的第二个星期三:
FREQ=MONTHLY; BYDAY=2WED;
运行一年的最后一个星期五:
FREQ=YEARLY; BYDAY=-1FRI;
运行 每 50 小时:
FREQ=HOURLY; INTERVAL=50;
运行 每隔一个月的最后一天:
FREQ=MONTHLY; INTERVAL=2; BYMONTHDAY=-1;
运行 每个月的前三天每小时:
FREQ=HOURLY; BYMONTHDAY=1,2,3;
运行每年的第60天、第120天和第180天:
FREQ=YEARLY; BYYEARDAY=60,120,180;
运行 每个月的最后一个工作日(假设工作日为周一至周五):
FREQ=MONTHLY; BYDAY=MON,TUE,WED,THU,FRI; BYSETPOS=-1
这里有一些更复杂的例子,它们引用了以下命名的时间表:
BEGIN
sys.DBMS_SCHEDULER.create_schedule (
schedule_name => 'COMPANY_HOLIDAYS',
repeat_interval => 'FREQ=YEARLY; BYDATE=0704,0905,1124,1125,1225;');
sys.DBMS_SCHEDULER.create_schedule (
schedule_name => 'JUL4',
repeat_interval => 'FREQ=YEARLY; BYMONTH=JUL; BYMONTHDAY=4;');
sys.DBMS_SCHEDULER.create_schedule (
schedule_name => 'MEM',
repeat_interval => 'FREQ=YEARLY; BYMONTH=MAY; BYMONTHDAY=30;');
sys.DBMS_SCHEDULER.create_schedule (
schedule_name => 'LAB',
repeat_interval => 'FREQ=YEARLY; BYMONTH=SEP; BYMONTHDAY=5;');
sys.DBMS_SCHEDULER.create_schedule (
schedule_name => 'LAST_SAT',
repeat_interval => 'FREQ=MONTHLY; BYDAY=SAT; BYSETPOS=-1;');
sys.DBMS_SCHEDULER.create_schedule (
schedule_name => 'END_QTR',
repeat_interval => 'FREQ=YEARLY; BYDATE=0331,0630,0930,1231;');
sys.DBMS_SCHEDULER.create_schedule (
schedule_name => 'FISCAL_YEAR',
repeat_interval => 'FREQ=YEARLY;BYDATE=0301,0601,0901,1201;PERIODS=4;');
END;
/
运行每月最后一个工作日,不包括公司假期: 频率=每月;白天=周一、周二、周三、周四、周五;排除=COMPANY_HOLIDAYS; BYSETPOS=-1
运行每周五中午及公司假期: 频率=每年;白天=星期五;下班时间=12;包括=COMPANY_HOLIDAYS
运行 这三个假期:7 月 4 日、阵亡将士纪念日和劳动节: 7 月 4 日,MEM,实验室
运行 在该月的最后一天(星期六或季度的最后一天):
FREQ=MONTHLY; BYMONTHDAY=-1; INTERSECT=LAST_SAT,END_QTR
运行财政年度每个季度的最后一个星期三:
FREQ=FISCAL_YEAR;BYDAY=-1WED
运行会计年度第2、4季度的最后一个工作日(假设工作日为周一至周五):
FREQ=FISCAL_YEAR;BYDAY=MON,TUE,WED,THU,FRI;BYPERIOD=2,4;BYSETPOS=-1