【问题标题】:How to schedule Oracle DBMS Jobs in a window如何在窗口中安排 Oracle DBMS 作业
【发布时间】:2018-03-18 22:59:19
【问题描述】:

我想创建一个 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'

【问题讨论】:

  • 9:00 到 20:00 之间的频率是多少?
  • 我希望作业在工作日的 9:00 到 20:00 之间每 10 分钟执行一次...

标签: oracle plsql oracle11g dbms-scheduler


【解决方案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_,并从最后一个查询的选择列表中删除owner

select job_name, next_run_date                                  
  from user_scheduler_jobs                                               
 where JOB_NAME = 'JB_EN_LOPES'; 

【讨论】:

  • 09:00 到 20:00 每 10 分钟一次,我忘了,抱歉
  • @enLopes 我通过删除bysetpos=-1 部分再次进行了编辑(我已经看到不适合分钟间隔)并将job_type 更改为STORED_PROCEDURE
  • 同样的结果 :-(
  • @enLopes 我已经添加了我的结果。
  • @enLopes 并删除了“exclude=Company_Holidays”部分。
【解决方案2】:

我认为这是不可能的:

以下是一些 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:15 运行:

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;
/

在每个月的最后一个工作日运行,不包括公司假期: 频率=每月; BYDAY=周一、周二、周三、周四、周五;排除=公司_假期; BYSETPOS=-1

每周五中午和公司假期运行: 频率=每年; BYDAY=FRI;BYHOUR=12; INCLUDE=COMPANY_HOLIDAYS

在这三个假期运行:7 月 4 日、阵亡将士纪念日和劳动节: JUL4,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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-19
    • 1970-01-01
    • 2022-09-26
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    • 2020-01-05
    • 2014-02-04
    相关资源
    最近更新 更多