Inhaltsverzeichnis
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 ⇒ 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' /