DEV Community

Pranav Bakare
Pranav Bakare

Posted on • Edited on

DBMS_SCHEDULER in Oracle Database - Complete Guide

📘 Mastering Oracle DBMS_SCHEDULER: A Developer’s Guide to Automating Database Jobs

In enterprise database systems, task automation is essential for scalability, consistency, and system performance. Oracle’s DBMS_SCHEDULER package provides a robust framework for scheduling, executing, and managing jobs inside the Oracle database. In this blog, I’ll walk you through all the major procedures within the DBMS_SCHEDULER package, with explanations and code examples from my hands-on experience.


🧠 What is DBMS_SCHEDULER?

The DBMS_SCHEDULER package is Oracle’s modern and enhanced job-scheduling tool that replaces the older DBMS_JOB package. It allows scheduling of:

  • PL/SQL blocks
  • Stored procedures/functions
  • External programs or shell scripts

This helps automate ETL processes, data archival, monitoring, reporting, and other recurring tasks within the database.


🧰 Key Procedures in DBMS_SCHEDULER

Let’s break down the essential procedures available in this package:


1. 🔨 CREATE_JOB

  • Purpose: Create a new scheduled job in the database.

Example:

BEGIN
  DBMS_SCHEDULER.create_job (
    job_name        => 'job_data_archival',
    job_type        => 'PLSQL_BLOCK',
    job_action      => 'BEGIN archive_old_data(); END;',
    start_date      => SYSTIMESTAMP,
    repeat_interval => 'FREQ=DAILY;BYHOUR=2',
    enabled         => FALSE,
    comments        => 'Archives old data daily at 2 AM'
  );
END;
/
Enter fullscreen mode Exit fullscreen mode

Explanation: This procedure creates a named job that executes a given PL/SQL block at scheduled intervals. The enabled => FALSE allows you to review before it starts running.


2. ▶️ RUN_JOB

  • Purpose: Manually execute a scheduled job on demand.

Example:

BEGIN
  DBMS_SCHEDULER.run_job('job_data_archival');
END;
/
Enter fullscreen mode Exit fullscreen mode

Explanation: Useful for testing or ad-hoc execution without waiting for the scheduled time.


3. ✅ ENABLE

Purpose: Activate a scheduled job.

Example:

BEGIN
  DBMS_SCHEDULER.enable('job_data_archival');
END;
/
Enter fullscreen mode Exit fullscreen mode

Explanation: Once enabled, the job starts executing as per its defined interval.


4. ⛔ DISABLE

Purpose: Pause or suspend a job temporarily.

Example:

BEGIN
  DBMS_SCHEDULER.disable('job_data_archival');
END;
/
Enter fullscreen mode Exit fullscreen mode

Explanation: Use this when you want to stop a job from executing but keep its definition.


5. 🛑 STOP_JOB

Purpose: Immediately stop a running job.

Example:

BEGIN
  DBMS_SCHEDULER.stop_job('job_data_archival', force => TRUE);
END;
/
Enter fullscreen mode Exit fullscreen mode

Explanation: Halts an ongoing job execution. Useful when a job hangs or needs intervention.


6. ❌ DROP_JOB

Purpose: Completely remove a job from the scheduler.

Example:

BEGIN
  DBMS_SCHEDULER.drop_job('job_data_archival');
END;
/
Enter fullscreen mode Exit fullscreen mode

Explanation: Use with caution — this permanently deletes the job definition.


7. 🔁 SET_ATTRIBUTE

Purpose: Modify job parameters like frequency, action, or comments.

Example:

BEGIN
  DBMS_SCHEDULER.set_attribute(
    name      => 'job_data_archival',
    attribute => 'repeat_interval',
    value     => 'FREQ=WEEKLY;BYDAY=SUN;BYHOUR=3'
  );
END;
/
Enter fullscreen mode Exit fullscreen mode

Explanation: Dynamically update job behavior without recreating it.


8. 🧱 CREATE_JOB_CLASS

Purpose: Group jobs logically under a job class.

Example:

BEGIN
  DBMS_SCHEDULER.create_job_class(
    job_class_name           => 'ARCHIVAL_JOBS',
    resource_consumer_group  => 'DEFAULT_CONSUMER_GROUP',
    logging_level            => DBMS_SCHEDULER.LOGGING_FULL
  );
END;
/

Enter fullscreen mode Exit fullscreen mode

Explanation: Helps in managing logging levels, resource priorities, and collective administration.


9. 🧩 CREATE_PROGRAM & CREATE_SCHEDULE

Purpose: Create reusable logic and time blocks.

Example:

Reusable action (program)

--
BEGIN
  DBMS_SCHEDULER.create_program (
    program_name        => 'prog_archive',
    program_type        => 'PLSQL_BLOCK',
    program_action      => 'BEGIN archive_old_data(); END;',
    number_of_arguments => 0,
    enabled             => TRUE
  );
END;
/
Enter fullscreen mode Exit fullscreen mode

Reusable timing (schedule)

-- 
BEGIN
  DBMS_SCHEDULER.create_schedule (
    schedule_name   => 'schedule_daily_3am',
    start_date      => SYSTIMESTAMP,
    repeat_interval => 'FREQ=DAILY;BYHOUR=3',
    comments        => 'Daily run at 3 AM'
  );
END;
/
Enter fullscreen mode Exit fullscreen mode

Combine into job

BEGIN
  DBMS_SCHEDULER.create_job (
    job_name        => 'job_archive',
    program_name    => 'prog_archive',
    schedule_name   => 'schedule_daily_3am',
    job_class       => 'ARCHIVAL_JOBS',
    enabled         => TRUE
  );
END;
/
Enter fullscreen mode Exit fullscreen mode

Explanation: Encourages modular and maintainable job design by decoupling logic and timing.


📊 Monitoring and Debugging Jobs

You can track job execution and errors via Oracle views:

-- View job metadata
SELECT job_name, enabled, state, last_start_date, next_run_date
FROM dba_scheduler_jobs;

-- View job run details
SELECT * FROM dba_scheduler_job_run_details
WHERE job_name = 'job_data_archival';

Enter fullscreen mode Exit fullscreen mode

📎 Real-World Use Cases from My Project

  • ETL Scheduling: Automated data ingestion and staging from external systems
  • Data Archival: Periodic removal and archiving of old records to improve performance
  • System Health Checks: Jobs scheduled for log purging, session monitoring, and backups
  • Hybrid Cron Integration: Combined DBMS_SCHEDULER with Linux Cron jobs to call PL/SQL from shell scripts

🧾 Summary of Key Procedures

Procedure Description

CREATE_JOB  Define a new job with logic and timing
RUN_JOB Execute job manually
ENABLE / DISABLE    Control job activation
STOP_JOB    Interrupt an active job
DROP_JOB    Delete the job permanently
SET_ATTRIBUTE   Update job properties
CREATE_JOB_CLASS    Logical grouping and resource control
CREATE_PROGRAM  Reusable PL/SQL logic
CREATE_SCHEDULE Reusable time/frequency definition
Enter fullscreen mode Exit fullscreen mode

🎯 Final Thoughts

The DBMS_SCHEDULER package is not just a background utility — it's a powerful tool for backend orchestration. Whether you’re running ETL pipelines, automating maintenance tasks, or integrating external workflows, mastering these procedures gives you full control over job automation inside Oracle databases.

Top comments (0)