Netcos AG   XCP™ Blackboard
Tip 1   Tip 1 Tip 3  Tip 3
Tip No. 2   Job-Intervall steuern
Mit einer eigenen Funktion die Ausführung von Datenbank-Jobs steuern

Normalerweise wird bei einem Datenbank-Job die Steuerung des Zeitintervalls des Jobs
als Parameter einer Berechnung auf Basis der Funktion "sysdate" durchgeführt.

Zum Beispiel:
1. Job eintragen:
VARIABLE jobno number;
BEGIN
   DBMS_JOB.SUBMIT(:jobno,
       ,  'vki0004.sendmail'
       ,  SYSDATE
       , 'SYSDATE + 1'); -- Ausführungintervall
   commit;
END;
/
2. Ausführunginterval
BerechungBeispiel
sysdate+1nächster Tag um die selbe Zeit
sysdate+1/24in einer Stunde
sysdate+((1/24)/2)in einer halben Stunde
sysdate+((1/24)/60)in einer Minute

Ist der Job mit seiner Arbeit fertig, trägt er den errechneten Wert für den nächsten Aufruf in die Scheduler-Tabelle ein.
Was aber tun, wenn nur wührend der Arbeitszeit der Job notwendig ist?

Wir wollen zum Beispiel das folgende Aussführungintervall erreichen:
Nur zwischen 7:00 und 19:00 soll der Job jede Stunde gestartet werden.

Als Lösung für das Problem schreiben wir uns eine eigene Funktion mit dem Rückgabewert date.
create or replace function getJobIntervall(p_job varchar2)
 return date
is
  v_min   number      :=(1/24)/60; -- Minuten
  v_h     number      :=(1/24);    -- Stunden
  v_begin pls_integer :=7;
  v_end   pls_integer :=19;
  v_next_date date;
begin
 if to_number(to_char(sysdate,'HH24')) between v_begin and v_end then

  v_next_date:=sysdate+v_h;  --jede Stunde

   -- Zeit intervalle einführen
   -- abhängikeiten usw. auflösen
 else

  v_next_date:=to_date(
  		to_char(
  		sysdate+1,'dd.mm.yyyy')
  			||'0'
  			||to_char(v_begin),'dd.mm.yyyy hh24:mi');

 end if;

 return v_next_date;
end;
/
Anlegen eines Jobs mit:
VARIABLE jobno number;
BEGIN
   DBMS_JOB.SUBMIT(:jobno,
       ,  'vki0004.sendmail'
       ,  SYSDATE
       , 'getJobIntervall(''SENDMAIL'')'); -- Ausführungintervall
   commit;
END;
/

Falls Sie planen, beachten Sie genau über noch eine weitere Tabelle mehrere Jobs parallel zu synchronisieren, das Transaktionsmodell der Datenbank.
Sie müssen entweder mit "FOR UPDATE" arbeiten oder besser eine interne Oracle QUEUE für solche Anforderungen einsetzen.