Oracle-Jobs via DBMS_JOB sind eine feine Sache. Würde nur nicht das Intervall erst am Ende, also nach der Ausführung des Jobs, gesetzt werden.
Das nervt. Also wenn man einen Job hat, der sagen wir alle 10 Minuten laufen soll, so verschiebt sich die Ausführung grundsätzlich um die Zeit, die der Job selbst zur Abarbeitung benötigt. Das heisst, bei einem 60sek. Job, der via Intervall “sysdate+(1/1440)” alle 10min laufen soll, und um, sagen wir 10:10 das erste mal rennt, beginnt dieser die nächsten Ausführungen um 10:21, 10:32 usw…
Abhilfe schafft ein wenig Mathematik im Intervall:
Man nehme:
to_date(
floor(
to_number(
to_char(sysdate,’YYYYMMDDHH24MI’)
)/10
)*10,’YYYYMMDDHH24MI’
)+10/1440
Was passiert hier ?
– Das Datum wird MSB -> LSB geholt und durch 10 geteilt. Bedeutet die “Minute” steht hinter dem Komma.
– Jetzt nutzen wir “FLOOR” um alles hinter dem Komma auf “0” zu setzen.
– Das ganze wieder mal 10 nehmen, um die 0 vor das Komma zu bekommen
– Jetzt noch in ein Datum konvertieren und das 10min. Intervall (+(10/1440)) draufschlagen
– Fertig.
Doch Vorsicht: Bei Jobs die länger als 10min. laufen, könnte das nächste Intervall in der Vergangenheit liegen ;-(