The Legacy Obituaries

DBMS_JOB

pre-11.2 · scheduler · deprecated 12.2

Survived, partially.

✓ certified by the mortician

In life

DBMS_JOB is the original PL/SQL job queue. A session submits an anonymous block together with a first run time and an interval expression, commits, and background job-queue processes execute it on that cadence. It predates Oracle Scheduler by many years and is still found in installation scripts and packaged applications, frequently created by code paths that nobody remembers.

Migrations care because each job is hidden scheduling state that does not appear in the schema DDL most tools extract. The interval is a free-form date expression rather than a calendar string, submission only takes effect on COMMIT, and jobs run with the submitting schema's privileges. All of that has to be rediscovered before it can be mapped onto Azure scheduling options.

Oracle's 12.2 Upgrade Guide lists the package as deprecated with DBMS_SCHEDULER as the replacement, and the 19c package reference says the package has been superseded and that support may be removed in a future release. It has not been desupported as of 26ai. Starting with 19c, an upgrade re-creates existing jobs as Scheduler jobs and DBMS_JOB survives only as a compatibility interface; schemas that submit jobs must hold the CREATE JOB privilege, and metadata problems surface as a JOB_TABLE_INTEGRITY precheck warning.

Cause of departure

Deprecated in Oracle Database 12.2; still functional, no longer recommended. Oracle names DBMS_SCHEDULER as the successor.

Obituary

DBMS_JOB, born before 11.2, scheduled anonymous PL/SQL blocks and procedure calls at intervals. Its transactional submissions vanished obediently whenever the caller’s transaction rolled back.

Deprecated in 12.2 but not desupported, it remained functional through 26ai as a wrapper over DBMS_SCHEDULER. Reports of its 19c demise usually reflected the new CREATE JOB privilege requirement, whose absence produces ORA-27486, rather than an actual removal.

It is survived by Azure SQL Elastic Jobs, partly; pg_cron extension on PostgreSQL Flexible Server, partly; and SQL Server Agent on SQL Managed Instance, partly. Each requires medium effort, converted job bodies, and acceptance that the old transactional submission semantics did not make the journey.

Survived by

Azure SQL Elastic Jobs partial effort M

Applies to Oracle 11.2, 12.1, 12.2, 18c, 19c, 21c, 23ai

Azure SQL Database has no Agent, so legacy DBMS_JOB submissions become Elastic Jobs: T-SQL steps run by a separate job agent against one or more databases on a UTC schedule. Simple interval jobs map cleanly; jobs that expected to run inside the same database engine with the submitter's transaction semantics, or that called OS-level code, do not.

  • Provision an elastic job agent with a dedicated, non-Hyperscale job database.
  • Convert each job's PL/SQL body to a stored procedure in the target database.
  • Define a target group for the database(s) and a job with a T-SQL step that executes the procedure.
  • Translate the Oracle INTERVAL expression to a schedule, remembering all times are UTC.
  • Make the step idempotent, because the agent retries failed executions.

Complications

minor DBMS_JOB.SUBMIT is transactional and is rolled back with the caller's transaction even in 19c, whereas DBMS_SCHEDULER.CREATE_JOB, SQL Server Agent job creation and Elastic Jobs definitions commit immediately; code that submitted jobs conditionally inside a transaction needs a different pattern.
Oracle 11.2, 12.1, 12.2, 18c, 19c, 21c, 23ai · community Connor McDonald: DBMS_JOB - the joy of transactions

pg_cron extension (PostgreSQL Flexible Server) partial effort M

Applies to Oracle 11.2, 12.1, 12.2, 18c, 19c, 21c, 23ai

pg_cron schedules SQL commands with cron expressions inside PostgreSQL, so a DBMS_JOB that ran a procedure every N minutes becomes a cron.schedule call running CALL procedure(). Cron granularity is a minute (or a fixed seconds interval), there is no transactional submit, and jobs run in the configured cron database unless scheduled with cron.schedule_in_database.

  • Allowlist pg_cron and add it to shared_preload_libraries, then restart the server.
  • Convert the job body to a PL/pgSQL procedure (Ora2Pg or the VS Code schema conversion tool).
  • Schedule with cron.schedule_in_database so the job runs in the application database, leaving the username argument null.
  • Set cron.timezone if the Oracle job times were local, since pg_cron defaults to GMT.
  • Monitor cron.job_run_details and forward failures to Azure Monitor alerts.

SQL Server Agent (on SQL Managed Instance) partial effort M

Applies to Oracle 11.2, 12.1, 12.2, 18c, 19c, 21c, 23ai

DBMS_JOB jobs are anonymous PL/SQL blocks or procedure calls on an interval; SQL Server Agent on Managed Instance runs T-SQL job steps on schedules, which covers the same ground once the PL/SQL is converted. What does not carry over is the transactional submit semantics of DBMS_JOB (a job submitted inside a rolled-back transaction disappears) and the interval expression syntax, which becomes an Agent schedule. Agent on Managed Instance also lacks CmdExec steps, proxies and alerts.

  • Inventory jobs in DBA_JOBS and note that from 19c each one is also visible as a DBMS_JOB$_n row in DBA_SCHEDULER_JOBS.
  • Convert the WHAT block with SSMA into a stored procedure.
  • Create an Agent job with a T-SQL step calling the procedure and a schedule equivalent to the INTERVAL expression.
  • Replace failure handling that relied on BROKEN flags with Agent job step retry and notification settings.
  • Re-test any job that assumed the submit was rolled back with the caller's transaction.

Complications

major From 19c, schemas that call DBMS_JOB.SUBMIT must hold the CREATE JOB privilege; without it submissions fail with ORA-27486, which is the usual reason for reports that DBMS_JOB 'no longer works' after upgrade.
minor An Ask TOM question titled 'dbms_job.submit(v_job, ''Proc(JOB);'', sysdate) - not working anymore in 19c' claims that DBMS_JOB job submission stopped working after an upgrade to 19c (12.1.0.2 to 19.8 per the thread summary); this is the poster's claim, and the community explanations attribute such failures to the new CREATE JOB privilege requirement and scheduler conversion rather than to removal of the package.
minor DBMS_JOB is deprecated but continues to function in 19c and later: each DBMS_JOB.SUBMIT creates a paired DBMS_SCHEDULER job named DBMS_JOB$_n, existing jobs are converted during upgrade, and the legacy interface remains a supported wrapper over the scheduler.
minor Upgrading to 19c converts existing DBMS_JOB jobs into DBMS_SCHEDULER jobs and records the mapping in a new dictionary table (scheduler$_dbmsjob_map); DBMS_JOB has been deprecated since 12.2.0.1 but Oracle had announced no desupport at the time of the post, so migration inventories should read DBA_SCHEDULER_JOBS as well as DBA_JOBS.

Contested accounts

Did DBMS_JOB stop working in 19c?

Oracle documents DBMS_JOB as deprecated since 12.2 with existing jobs converted to Scheduler jobs and the legacy interface still functional. An Ask TOM thread reports that DBMS_JOB.SUBMIT 'stopped working' after a 12.1 to 19.8 upgrade, and that framing circulates as 'DBMS_JOB was removed in 19c'.

DBMS_JOB is deprecated but continues to function in 19c and later: each DBMS_JOB.SUBMIT creates a paired DBMS_SCHEDULER job named DBMS_JOB$_n, existing jobs are converted during upgrade, and the legacy interface remains a supported wrapper over the scheduler.

An Ask TOM question titled 'dbms_job.submit(v_job, ''Proc(JOB);'', sysdate) - not working anymore in 19c' claims that DBMS_JOB job submission stopped working after an upgrade to 19c (12.1.0.2 to 19.8 per the thread summary); this is the poster's claim, and the community explanations attribute such failures to the new CREATE JOB privilege requirement and scheduler conversion rather than to removal of the package.

Resolution. Both observations are true and compatible. From 19c a schema calling DBMS_JOB.SUBMIT needs the CREATE JOB privilege, otherwise it fails with ORA-27486; that privilege change, not removal, is behind most 'not working anymore' reports. The package is deprecated and functional through 26ai. For an Azure move the consequence is unchanged: job bodies are PL/SQL and must be re-homed to SQL Server Agent (Managed Instance), Elastic Jobs (Azure SQL Database) or pg_cron (PostgreSQL), but the timeline is not forced by removal. (DBMS_JOB (PL/SQL Packages and Types Reference 19c))

Notices of correction

  1. oracle Deprecated Features in Oracle Database 12c Release 2 (12.2) · Upgrade Guide 12.2, E86577 · read 2026-09-26
  2. oracle DBMS_JOB (PL/SQL Packages and Types Reference 19c) · PL/SQL Packages and Types Reference 19c · read 2026-09-26
  3. oracle Support for DBMS_JOB (Administrator's Guide 19c) · Database Administrator's Guide 19c · read 2026-09-26
  4. oracle Oracle Database Changes, Desupports, and Deprecations (Upgrade Guide 19c) · Upgrade Guide 19c, E96252-82, Aug 2026 · read 2026-09-26
  5. microsoft Elastic jobs in Azure SQL Database · page updated 2026-02-26 · read 2026-09-26
  6. microsoft Automation in Azure SQL overview (Elastic jobs vs SQL Agent) · page updated 2025-11-18 · read 2026-09-26
  7. community Connor McDonald: DBMS_JOB - the joy of transactions · blog post 2019-05-28 · read 2026-09-26
  8. microsoft Considerations when using extensions in Azure Database for PostgreSQL flexible server · page updated 2026-08-12 · read 2026-09-26
  9. community pg_cron README · pg_cron 1.6 · read 2026-09-26
  10. microsoft T-SQL differences between SQL Server and Azure SQL Managed Instance · page updated 2026-09-09 · read 2026-09-26
  11. community ORACLE-BASE: DBMS_JOB jobs converted to DBMS_SCHEDULER jobs in Oracle Database 19c · article created 2019-08-27, updated 2020-11-14 · read 2026-09-26
  12. community Ask TOM: dbms_job.submit(v_job, 'Proc(JOB);', sysdate) - not working anymore in 19c · Ask TOM question thread (title as indexed by search engines; page body blocked to automated retrieval on 2026-09-26) · read 2026-09-26
  13. community Mike Dietrich: DBMS_JOB behavior change in Oracle 19c during upgrade · blog post 2019-05-24 · read 2026-09-26

← All notices

DBMS_JOB — Legacy Obituaries