===== Die Oracle Repeat Interval Calendar Syntax nutzen ====
**10g bis 19c**
**Aufgabe:** Die Oracle Scheduler Calendaring Syntax verstehen und einsetzen.
Mehr über die Oracle Job Steuerung siehe => [[dba:oracle_scheduler|Der Oracle Job Scheduler 10g/11g/12c]]
Beim Anlegen eines Jobs ( B. über DBMS_SCHEDULER.create_schedule) kann ein Zeitintervall angegeben werden.
Das Zeitintervall wird aber nicht mehr wie früher in einem PL/SQL Ausdruck übergeben, sondern über eine Kalender Syntax definiert.
Die Syntax ist recht komplex siehe dazu die original Dokumentation unter =>http://docs.oracle.com/cd/E11882_01/appdev.112/e40758/d_sched.htm#ARPLS72273 ( nach repeat_interval suchen), für 12c siehe https://docs.oracle.com/en/database/oracle/oracle-database/12.2/admin/scheduling-jobs-with-oracle-scheduler.html#GUID-10B1E444-8330-4EC9-85F8-9428D749F7D5
Beispiele:
^Regel^Bedeutung^
|FREQ=hourly;BYMINUTE=0|stündlich aufrufen|
|FREQ=MINUTELY; INTERVAL=15|alle 15 Minuten aufrufen|
|FREQ=WEEKLY; BYDAY=MON|Jeden Montag aufrufen|
|FREQ=WEEKLY; BYDAY=Mon;BYHOUR=2;BYMINUTE=30;BYSECOND=0| Jeden Montag um 2:30:00 aufrufen|
|FREQ=WEEKLY;BYDAY=MON,TUE,WED,THU,FRI;BYHOUR=15;BYMINUTE=0;BYSECOND=0 | Jeden Wochentag um 15:00 den Job aufrufen|
----
==== Den Job anpassen ====
Nachträglich ändern:
BEGIN
DBMS_SCHEDULER.SET_ATTRIBUTE (
name => 'CHECK_LONG_RUNNING_TIMEPLAN'
, attribute => 'repeat_interval'
, value => 'FREQ=MINUTELY; INTERVAL=15');
END;
/
select *
from dba_scheduler_schedules
where schedule_name = 'DBA_TIMEPLAN'
/
----
==== Testen mit ====
Der Calender Ausdruck kann mit DBMS_SCHEDULER.EVALUATE_CALENDAR_STRING getestet werden.
DECLARE
v_next_run_date TIMESTAMP;
v_start_date TIMESTAMP:=systimestamp;
v_return_date_after TIMESTAMP
BEGIN
FOR i in 1 ..10
loop
DBMS_SCHEDULER.EVALUATE_CALENDAR_STRING(
calendar_string => 'FREQ=MINUTELY; INTERVAL=15'
, start_date => v_start_date
, return_date_after => v_return_date_after
, next_run_date => v_next_run_date);
DBMS_OUTPUT.PUT_LINE('-- Info actual date :: '||to_char(v_start_date,'dd.mm.yyyy hh24:mi')||
' --> next_run_date:: '||to_char(v_next_run_date,'dd.mm.yyyy hh24:mi')
);
v_return_date_after := v_next_run_date;
end loop;
END;
/
-- Info actual date :: 16.01.2015 19:19 --> next_run_date:: 16.01.2015 19:34
-- als Funktion
create or replace function getNextRunDate(p_calendar_string varchar2
,p_start_date TIMESTAMP WITH TIME ZONE default systimestamp
,p_return_date_after TIMESTAMP WITH TIME ZONE default systimestamp)
return date
is
v_next_run_date TIMESTAMP WITH TIME ZONE;
begin
dbms_scheduler.EVALUATE_CALENDAR_STRING(calendar_string => p_calendar_string
,start_date => p_start_date
,return_date_after => p_return_date_after
,next_run_date => v_next_run_date);
return v_next_run_date;
end;
/
-- abfragen über alle Jobs wann die Jobs das nächste mal und das übernächste mal laufen würden:
select js.job_name
, JS.REPEAT_INTERVAL
, js.next_run_date
, getNextRunDate(JS.REPEAT_INTERVAL,js.next_run_date,js.next_run_date) as over_next_run_date
, js.state||' - '||js.job_action as job_info
from dba_scheduler_jobs js
, dba_objects o
where js.owner = o.owner(+)
and js.job_name = o.OBJECT_NAME(+)
and js.owner != 'SYS'
/
----
==== Quellen ====
Oracle Doku: https://docs.oracle.com/en/database/oracle/oracle-database/12.2/admin/scheduling-jobs-with-oracle-scheduler.html#GUID-10B1E444-8330-4EC9-85F8-9428D749F7D5
Crontab Generator = > https://crontab-generator.org/