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