DBMS_SCHEDULER: Prozesse und Aktivitäten im Hintergrund

In der letzten Ausgabe haben Sie erfahren, wie Sie Prozesslogik mit dem PL/SQL-Paket DBMS_SCHEDULER im Hintergrund laufen lassen können. Heute erfahren Sie, wie Sie mit einen Job mit DBMS_SCHEDULER regelmäßig ausführen können.

Ein einfaches Beispiel für einen wiederkehrenden Job wurde bereits vor einiger Zeit im Rahmen dieser Community vorgestellt. In jenem Beispiel ging es darum, eine Datenbanktabelle regelmäßig (alle 15 Minuten) mit den Inhalten eines externen RSS-Feeds zu aktualisieren. Der Aufruf von DBMS_SCHEDULER war wie folgt:

begin
  dbms_scheduler.create_job(
    job_name            => '[JOB-NAME]',
    job_type            => 'stored_procedure',
    job_action          => '[PROCEDURE-NAME]',
    number_of_arguments => 0,
    start_date          => systimestamp,
    repeat_interval     => 'FREQ=MINUTELY; INTERVAL=15',
    end_date            => null,
    job_class           => 'DEFAULT_JOB_CLASS',
    enabled             => true,
    auto_drop           => true,
    comments            => null
  );
end;

Wichtig beim Aufruf von DBMS_SCHEDULER.START_JOB sind vor dabei die Parameter START_DATE und REPEAT_INTERVAL. START_DATE legt fest, wann der Job zum ersten Mal ausgeführt werden soll - SYSTIMESTAMP meint hier: Sofort. Wenn Sie möchten, dass der Job zu einem späteren Zeitpunkt gestartet werden soll, geben Sie hier den Zeitpunkt als TIMESTAMP-Wert an.

Wenn Sie NULL als REPEAT_INTERVAL übergeben, wird der Job genau einmal ausgeführt. Steht AUTO_DROP (wie in obigem Beispiel) dann auch noch auf TRUE, so wird der Job anschließend automatisch gelöscht.

Im obigen Beispiel ist jedoch festgelegt, dass der Job alle 15 Minuten ausgeführt werden soll - der Parameter REPEAT_INTERVAL ist einfach zu lesen (FREQ=MINUTELY; INTERVAL=15). Natürlich können auch wesentlich mächtigere Ausdrücke verwendet werden.

  • FREQ gibt die "grundsätzliche" Frequenz an - Neben MINUTELY sind auch SECONDLY, HOURLY, DAILY, WEEKLY, MONTHLY und YEARLY möglich. Diese Angabe alleine reicht jedoch noch nicht aus: Wird bspw. DAILY angegeben, so bleibt die Frage offen, an welchen Tagen und wann genau am Tag der Job ausgeführt werden soll.
  • INTERVAL gibt an, in welchem Intervall der Job ausgeführt werden soll und bezieht sich dabei stets auf die Frequenz des Parameters FREQ. "FREQ=DAILY; INTERVAL=2" meint also: alle zwei Tage.
  • Zusätzlich kann mit einer BY-Klausel festgelegt werden, zu welchem Zeitpunkt der Job ausgeführt werden soll. Wird also festgelegt "FREQ=DAILY; BYHOUR=9,18", dann wird der Job jeden Tag um 9:00 Uhr und 18:00 Uhr ausgeführt.

Mit diesen Angaben können nun auch komplizierte Zeitpläne erstellt werden. Angenommen, ein Job soll Aktienkurse abrufen - dies würde alle 15 Minuten Sinn machen, jedoch nur an Werktagen und zur Börsenzeit:
"FREQ=MINUTELY; INTERVAL=15; BYHOUR=9,10,11,12,13,14,15,16,17,18; BYDAY=MON,TUE,WED,THU,FRI"

Schließlich gibt der Parameter END_DATE an, ab wann der Job nicht mehr ausgeführt werden soll. Geben Sie hier einfach einen TIMESTAMP-Wert an. Wird nichts angegeben, so wird der Job solange ausgeführt, bis er explizit gestoppt oder gelöscht wird.

Mit der Data Dictionary View USER_SCHEDULER_JOBS erhalten Sie Informationen über Ihre Jobs. So erfahren Sie mit der Abfrage in Abbildung 1, welche Jobs existieren, wann Sie zuletzt ausgeführt wurden und wann die nächste Ausführung ansteht.

Abfrage der Data Dictionary View USER_SCHEDULER_JOBS

Abbildung 1: Abfrage der Data Dictionary View USER_SCHEDULER_JOBS

Zusätzlich steht die View USER_SCHEDULER_JOB_LOG bereit, in der Sie sich über die vergangenen Ausführungen informieren können. Fehler, die während der Ausführung auftreten, können in dieser View nachgesehen werden.

Abfrage der Data Dictionary View USER_SCHEDULER_JOB_LOG

Abbildung 2: Abfrage der Data Dictionary View USER_SCHEDULER_JOB_LOG

Selbstverständlich können Sie diese Informationen auch als Berichte in Ihre Application Express-Anwendungen aufnehmen und den Endanwender so bspw. über den Zeitpunkt der nächsten Aktualisierung informieren.

Zurück zur Community-Seite