Scheduler-Job anlegen, manuell ausführen, deaktivieren und löschen
OracleSchedulerBefehl
-- 1) Create disabled, set attributes, then enable:
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name => 'CUSTOMER_APP.NIGHTLY_STATS',
job_type => 'PLSQL_BLOCK',
job_action => q'[BEGIN DBMS_STATS.GATHER_SCHEMA_STATS(ownname => 'CUSTOMER_APP', options => 'GATHER STALE'); END;]',
start_date => SYSTIMESTAMP,
repeat_interval => 'FREQ=DAILY; BYHOUR=2; BYMINUTE=30; BYSECOND=0',
enabled => FALSE,
auto_drop => FALSE,
comments => 'Nightly stale statistics gathering');
DBMS_SCHEDULER.SET_ATTRIBUTE('CUSTOMER_APP.NIGHTLY_STATS', 'max_run_duration', INTERVAL '2' HOUR);
DBMS_SCHEDULER.SET_ATTRIBUTE('CUSTOMER_APP.NIGHTLY_STATS', 'logging_level', DBMS_SCHEDULER.LOGGING_FULL);
DBMS_SCHEDULER.ENABLE('CUSTOMER_APP.NIGHTLY_STATS');
END;
/
-- 2) Validate the calendar expression (next run time):
SET SERVEROUTPUT ON
DECLARE
l_next TIMESTAMP WITH TIME ZONE;
BEGIN
DBMS_SCHEDULER.EVALUATE_CALENDAR_STRING(
calendar_string => 'FREQ=DAILY; BYHOUR=2; BYMINUTE=30; BYSECOND=0',
start_date => SYSTIMESTAMP,
return_date_after => SYSTIMESTAMP,
next_run_date => l_next);
DBMS_OUTPUT.PUT_LINE('Next run: ' || l_next);
END;
/
-- 3) Run now in the background (does not affect the schedule):
EXEC DBMS_SCHEDULER.RUN_JOB('CUSTOMER_APP.NIGHTLY_STATS', use_current_session => FALSE);
-- 4) Status:
SELECT owner, job_name, enabled, state, run_count, failure_count,
last_start_date, next_run_date
FROM dba_scheduler_jobs WHERE owner = 'CUSTOMER_APP';
-- 5) Stop (if running) / disable / drop:
-- EXEC DBMS_SCHEDULER.STOP_JOB('CUSTOMER_APP.NIGHTLY_STATS', force => FALSE);
EXEC DBMS_SCHEDULER.DISABLE('CUSTOMER_APP.NIGHTLY_STATS', force => TRUE);
EXEC DBMS_SCHEDULER.DROP_JOB('CUSTOMER_APP.NIGHTLY_STATS', force => TRUE);Was es tut
Definiert mit DBMS_SCHEDULER einen geplanten PL/SQL-Job; setzt max_run_duration (löst bei Überschreitung ein Event aus) und eine detaillierte Logging-Stufe, validiert den Kalenderausdruck vorab und erlaubt einen manuellen Lauf, ohne den Zeitplan zu stören.
Wann einsetzen
Um wiederkehrende Datenbankarbeiten wie Wartung, ETL und Bereinigung statt per cron innerhalb der Datenbank auszuführen, mit Berücksichtigung von RAC/Data Guard.
Vorsicht
Keine Zusatzlizenz. Die Zeitzone von start_date ist wichtig: SYSTIMESTAMP nutzt die TZ des Datenbankservers; verwende eine explizite Region (z. B. 'Europe/Istanbul'), um Verschiebungen bei der Zeitumstellung zu vermeiden. Bei JOB_QUEUE_PROCESSES=0 läuft kein Job. DISABLE mit force=>TRUE stoppt eine laufende Ausführung nicht, sondern verhindert nur künftige Läufe; zum Abbrechen STOP_JOB verwenden. Einen Job in einem anderen Schema anzulegen erfordert CREATE ANY JOB.