改变oracle工作,从每个特定时间每5秒运行一次,直到每天特定时间

时间:2018-01-29 14:02:23

标签: sql oracle plsql dbms-scheduler

编辑:我需要以下工作从晚上11点到凌晨5点35分,每天在该窗口每5秒钟运行一次。

所以,到目前为止我所做的就是设置以下每5秒运行一次。

BEGIN

DBMS_SCHEDULER.SET_ATTRIBUTE (
    name => 'test_job',
    attribute => 'repeat_interval',
    value => 'freq=secondly;bysecond=5;'
);

END;

然后start_date和end_date使它从今天晚上9点到明天上午05:35运行。

BEGIN

DBMS_SCHEDULER.SET_ATTRIBUTE (
    name => 'test_job',
    attribute => 'start_date',
    value => TO_TIMESTAMP_TZ('2018-01-29 21:00:00.000000000 EUROPE/BERLIN','YYYY-MM-DD HH24:MI:SS.FF TZR')
);

END;

BEGIN

DBMS_SCHEDULER.SET_ATTRIBUTE (
    name => 'test_job',
   attribute => 'end_date',
    value => TO_TIMESTAMP_TZ('2018-01-30 05:35:00.000000000 EUROPE/BERLIN','YYYY-MM-DD HH24:MI:SS.FF TZR')
);

END;

现在问题是这将运行一次。我不确定如何在不放弃每5秒规则的情况下让它每天运行。我假设我可能需要使用start_date和duration并省略end_date来实现我的目标,尽管我不确定如何指定持续时间。

2 个答案:

答案 0 :(得分:0)

以下PL / SQL块创建一个轻量级作业。轻量级作业必须引用程序,程序类型必须为“PLSQL_BLOCK”或“STORED_PROCEDURE”。此外,创建作业时必须已启用该程序。

参见样本供您参考。如果有帮助,请告诉我。

BEGIN
      DBMS_SCHEDULER.CREATE_JOB (
       job_name         =>  'my_lightweight_job1',
       program_name     =>  'polling_prog_n2',
       repeat_interval  =>  'FREQ=SECONDLY;INTERVAL=5',
       end_date         =>  '30-JAN-18 05.35.00 AM',
       job_style        => 'LIGHTWEIGHT',
       comments         => 'Job that polls device n2 every 5 seconds');
    END;
    /

答案 1 :(得分:0)

您可以创建这样一个作业,调用名为pr_test的存储过程,每五秒执行一些操作:

begin
dbms_scheduler.create_job (
   job_name           =>  'test_job',
   job_type           =>  'STORED_PROCEDURE',
   job_action         =>  'pr_test',
   start_date         =>  TO_TIMESTAMP_TZ('2018-01-30 21:00:00.000000000 EUROPE/BERLIN','YYYY-MM-DD HH24:MI:SS.FF TZR'),
   end_date           =>  TO_TIMESTAMP_TZ('2018-01-30 21:00:00.000000000 EUROPE/BERLIN','YYYY-MM-DD HH24:MI:SS.FF TZR') + (17/48), -- 8.5 hours
   repeat_interval    =>  'freq=secondly; interval=5;',
   enabled            =>  true); 
end;
/

如果您希望每天运行您的计划程序作业,那么结束时间和间隔定义会更复杂(考虑到今天的日期为开始),如果没有end_date,这可以工作到06:00 am第二天:

begin
dbms_scheduler.create_job (
   job_name           =>  'test_job',
   job_type           =>  'STORED_PROCEDURE',
   job_action         =>  'pr_test',
   start_date         =>  TO_TIMESTAMP_TZ('2018-01-30 21:00:00.000000000 EUROPE/BERLIN','YYYY-MM-DD HH24:MI:SS.FF TZR'),
   repeat_interval    =>  'freq=secondly;interval=5;byhour=21,22,23,0,1,2,3,4,5;byday=tue,wed,thu,fri,sat,sun,mon;',
   enabled            =>  true); 
end;
/

并可以从这个视图中跟踪:

select * 
  from dba_scheduler_job_log l
 where l.job_name = 'TEST_JOB'
 order by l.log_date desc;