Das Erstellen von sogenannten „Chains“ kann ein wenig verwirrend sein, aber bietet im Austausch dafür, einige praktische Lösungen.
Die Chains des Schedulers werden benutzt, um verschiedene Programs in einer nach Rules definierten Abfolge laufen zu lassen.
In den folgenden Schritten konstruieren wir eine Chain, welche drei Programs (selbst geschriebene Prozeduren), abhängig vom Erfolg bzw. Misserfolg des vorherigen Program, startet.
Im Allgemeinen ist es immer derselbe Ablauf für das Erstellen von Chains:
Bevor wir anfangen, definieren wir unsere Prozedur als ein Program und aktivieren es. Dadurch können wir das zuvor erstelle Program in die Steps der Chain einbinden.
BEGIN
DBMS_SCHEDULER.CREATE_PROGRAM (
program_name => 'program1',
program_action => 'package1.prozedur1',
program_type => 'STORED_PROCEDURE',
comments => 'Mein Programm für meine Prozedur');
END;
/
BEGIN
DBMS_SCHEDULER.ENABLE('Program1');
END;
/
Gemacht wird das mit allen Prozeduren, die wir für die Chain benötigen. Ich habe das ganze noch mit Program 2 und Program 3 durchgeführt.
Nachdem die Programs erstellt wurden, können wir mit der Konstruktion unserer Chain anfangen.
BEGIN
DBMS_SCHEDULER.CREATE_CHAIN (
chain_name => 'chain1',
rule_set_name => NULL,
evaluation_interval => NULL,
comments => 'Das ist meine Chain');
END;
/
Hiermit wird eine Chain mit dem Namen „Chain1“ erstellt.
BEGIN
DBMS_SCHEDULER.DEFINE_CHAIN_STEP (
chain_name => 'chain1',
step_name => 'step1',
program_name => 'program1');
DBMS_SCHEDULER.DEFINE_CHAIN_STEP (
chain_name => 'chain1',
step_name => 'step2',
program_name => 'program2');
DBMS_SCHEDULER.DEFINE_CHAIN_STEP (
chain_name => 'chain1',
step_name => 'step3',
program_name => 'program3');
END;
/
Jedes Program hat jetzt seinen eigenen Step. Nun können wir diese in den Rules der Chain festlegen.
Hier legen wir die Rules fest:
Bildlich kann man sich das so vorstellen:
BEGIN
DBMS_SCHEDULER.DEFINE_CHAIN_RULE (
chain_name => 'chain1',
condition => 'TRUE',
action => 'START step1',
rule_name => 'rule1',
comments => 'start the chain');
DBMS_SCHEDULER.DEFINE_CHAIN_RULE (
chain_name => 'chain1',
condition => 'step1 SUCCEEDED',
action => 'START step2',
rule_name => 'rule2');
DBMS_SCHEDULER.DEFINE_CHAIN_RULE (
chain_name => 'chain1',
condition => 'step1 FAILED',
action => 'START step3',
rule_name => 'rule3');
DBMS_SCHEDULER.DEFINE_CHAIN_RULE (
chain_name => 'chain1',
condition => 'step3 COMPLETED',
action => 'END',
rule_name => 'rule4');
DBMS_SCHEDULER.DEFINE_CHAIN_RULE (
chain_name => 'chain1',
condition => 'step2 COMPLETED',
action => 'END',
rule_name => 'rule5');
END;
/
Ein wichtiger Unterschied macht hier „SUCCEDED“ und „COMPLETE“. SUCCEDED ist dann erreicht sobald der Step eben auch erfolgreich durchgeführt wurde. „Completed“ ist ein Job immer dann, wenn er einfach durchgelaufen ist. Auch ein FAILED Step ist ein COMPLETED Step.
Als nächstes muss die Chain aktiviert werden:
BEGIN
DBMS_SCHEDULER.ENABLE ('chain1');
END;
/
Den Job für den Chain Start erstellen wir mit folgenden Parametern:
BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'chain_starter1',
job_type => 'CHAIN',
job_action => 'chain1',
repeat_interval => 'FREQ=WEEKLY; BYDAY=MON; BYHOUR=03',
auto_drop => FALSE,
start_date => '01-MAR-19 03.00.00 AM Europe/Berlin',
comments => 'Starter für Chain1',
enabled => TRUE);
END;
/
Voila, wir haben eine funktionierende Chain für den Scheduler.
Das Erstellen einer Chain ist relativ simpel und hat durchaus eine Daseinsberechtigung. Es ist eine vielfältige Konstruktion die sich nach Belieben anpassen lässt.
Die Bedingungen „SUCCEEDED“ und „FAILED“ in den Regeln sind nur Beispiele dessen, was alles gemacht werden kann. Es gibt noch einige mehr welche auch zu deutlich komplexeren Chains entwickelt werden können. Dieser Tipp soll nur ein erstes Bild vermitteln.
Für weitere Fragen bezüglich des Schedulers stehen wir Ihnen natürlich gerne zur Verfügung.
In unserer Know-How Datenbank finden Sie mehr als 300 ausführliche Beiträge zu den
Oracle-Themen wie DBA, SQL, PL/SQL, APEX und vielem mehr.
Hier erhalten Sie Antworten auf Ihre Fragen.