Apr 14

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 ;-(

2 Responses to “Drifting Oracle Jobs”

  1. stard sagt:

    nur für die google treffer:

    TRUNC(SYSDATE,’MI‘) + 10/1440

    macht das gleiche ist aber deutlich unkomplizierter 🙂

  2. Joerg sagt:

    Nunja, nicht wirklich. Bei Deiner Variante verschiebt sich der nächste Lauf nämlich auch um die Länge des Vorläufers.

    Beispiel: Der Job ist um 14:30 gestartet und läuft 3 Minuten, dann ist es 14:33. Bei Dir purzelt als Ergebnis 14:43 raus, bei mir 14:40 (so wie es sein soll).

    Lasse mich gerne korrigieren – aber das „Driften“ lässt sich so sicherlich nicht lösen !

Leave a Reply

preload preload preload