⏰ Module 12: Oracle Scheduler & Jobs

DBMS_SCHEDULER, Job Chains, Event-based Scheduling

DBMS
Job Scheduling
SCHEDULE
Frequency
CHAIN
Dependencies
RUN
Execution

⏱️ Oracle Scheduler Overview

DBMS_SCHEDULER Components

Component Purpose Example
Job Task to execute Stored procedure, SQL script
Schedule When to run Daily at 2 AM, Weekly on Monday
Program Reusable task definition With parameters and arguments
Chain Multiple jobs in sequence Dependent job execution
Window Resource allocation period Maintenance windows

📅 Creating Schedules

Named Schedule

-- Create a named schedule (every day at 2 AM)
BEGIN
  DBMS_SCHEDULER.CREATE_SCHEDULE(
    schedule_name => 'daily_2am',
    start_date => TRUNC(SYSDATE) + 2/24,
    repeat_interval => 'FREQ=DAILY;BYHOUR=2',
    comments => 'Daily backup schedule'
  );
END;
/

-- More schedule examples
-- Every Monday at 3 AM
FREQ=WEEKLY;BYDAY=MON;BYHOUR=3

-- Every 6 hours
FREQ=DAILY;INTERVAL=6

-- 1st and 15th of month at midnight
FREQ=MONTHLY;BYMONTHDAY=1,15;BYHOUR=0

🎯 Creating Jobs

Simple Job Creation

-- Create a job that runs a procedure
BEGIN
  DBMS_SCHEDULER.CREATE_JOB(
    job_name => 'backup_job',
    job_type => 'STORED_PROCEDURE',
    job_action => 'SYS.backup_database',
    schedule_name => 'daily_2am',
    enabled => TRUE,
    comments => 'Daily database backup'
  );
END;
/

-- Create inline job with SQL
BEGIN
  DBMS_SCHEDULER.CREATE_JOB(
    job_name => 'cleanup_logs',
    job_type => 'PLSQL_BLOCK',
    job_action => 'BEGIN DELETE FROM logs WHERE log_date < TRUNC(SYSDATE) - 30; COMMIT; END;',
    repeat_interval => 'FREQ=DAILY;BYHOUR=1',
    enabled => TRUE
  );
END;
/

⛓️ Job Chains

Creating a Job Chain

-- Create chain for sequential jobs
BEGIN
  -- Create chain
  DBMS_SCHEDULER.CREATE_CHAIN(
    chain_name => 'daily_maintenance',
    rule_set_name => 'daily_maintenance_ruleset',
    evaluation_interval => 'FREQ=MINUTELY;INTERVAL=1',
    comments => 'Daily maintenance sequence'
  );
  
  -- Create chain rules (dependencies)
  DBMS_SCHEDULER.DEFINE_CHAIN_RULE(
    chain_name => 'daily_maintenance',
    rule_name => 'analyze_tables_first',
    condition => 'TRUE',
    action => 'START_STEPS',
    step_name => 'analyze_step'
  );
  
  DBMS_SCHEDULER.DEFINE_CHAIN_RULE(
    chain_name => 'daily_maintenance',
    rule_name => 'backup_after_analyze',
    condition => 'analyze_step = COMPLETED',
    action => 'START_STEPS',
    step_name => 'backup_step'
  );
END;
/

🔧 Job Management

Essential Job Operations

-- Enable job
BEGIN
  DBMS_SCHEDULER.ENABLE('backup_job');
END;
/

-- Disable job
BEGIN
  DBMS_SCHEDULER.DISABLE('backup_job');
END;
/

-- Run job immediately
BEGIN
  DBMS_SCHEDULER.RUN_JOB('backup_job');
END;
/

-- Stop a running job
BEGIN
  DBMS_SCHEDULER.STOP_JOB('backup_job');
END;
/

-- Drop job
BEGIN
  DBMS_SCHEDULER.DROP_JOB('backup_job', force => TRUE);
END;
/

📊 Monitoring Jobs

View Job Information

-- View all jobs
SELECT job_name, job_type, enabled, state
FROM user_scheduler_jobs;

-- View job execution history
SELECT job_name, log_id, status, run_duration
FROM user_scheduler_job_log
ORDER BY log_date DESC;

-- View running jobs
SELECT job_name, state, cpu_used
FROM user_scheduler_running_jobs;

-- View schedules
SELECT schedule_name, repeat_interval, enabled
FROM user_scheduler_schedules;

Job Status Reference

Status Description
ENABLED Job is active and scheduled
DISABLED Job exists but won't run
RUNNING Job is currently executing
SUCCEEDED Last execution completed successfully
FAILED Last execution encountered error
💡 Tip: Use descriptive job names. Always include error handling in job procedures. Monitor job logs regularly. Use chains for complex workflows. Schedule maintenance during off-peak hours.
✓ Learning Checklist - Module 12