|
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:
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.
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.
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
|