Skip Headers

Oracle9i Database Administrator's Guide
Release 2 (9.2)

Part Number A96521-01
Go To Documentation Library
Home
Go To Product List
Book List
Go To Table Of Contents
Contents
Go To Index
Index

Master Index

Feedback

Go to previous page Go to next page

10
Managing Job Queues

This chapter describes how to use job queues to schedule the periodic execution of user jobs, and contains the following topics:

Enabling Processes Used for Executing Jobs

You can schedule routines (jobs) to be run periodically using the job queue. To schedule a job you submit it to the job queue, using the Oracle supplied DBMS_JOB package, and specify the frequency at which the job is to be run. Additional functionality enables you to alter, disable, or delete a job that you previously submitted.

Job queue (Jnnn) processes execute jobs in the job queue. For each instance, these job queue processes are dynamically spawned by a coordinator job queue (CJQ0) background process. The coordinator periodically selects jobs that are ready to run from the jobs shown in the DBA_JOBS view. It orders them by time, and then spawns Jnnn processes to run the selected jobs. Each Jnnn process executes one of the selected jobs.

The JOB_QUEUE_PROCESSES initialization parameter controls whether a coordinator job queue process is started by an instance. If this parameter is set to 0, no coordinator job queue process is started at database startup, and consequently no job queue jobs are executed. The JOB_QUEUE_PROCESSES initialization parameter also specifies the maximum number of Jnnn processes that can concurrently run on an instance. The maximum number of processes that can be specified is 1000.

The following initialization parameter setting causes the coordinator job queue process to start at database startup, and allows the spawning of a maximum of 60 concurrent Jnnn processes.

JOB_QUEUE_PROCESSES = 60

In any given period that the coordinator job queue process scans the jobs shown in the DBA_JOBS view, it spawns at most only the number of Jnnn processes required to execute the jobs it has selected. While the above example allows for 60 concurrent Jnnn processes, if only 20 jobs are selected for execution, then the coordinator spawns, or reuses, only the number of Jnnn processes necessary to execute the 20 jobs (at least, 20). Any idle existing Jnnn processes are considered available for reuse.

When a Jnnn process finishes execution of a job, it polls for another job to execute. If there are no jobs selected for execution, it enters an idle state, but wakes up periodically to poll again. If, after a predetermined number of tries, it still finds no jobs to execute, it terminates.

The JOB_QUEUE_PROCESSES initialization parameter is dynamic and it can be modified by an ALTER SYSTEM statement. For example, the following statement sets the maximum number of concurrent Jnnn processes allowed to 20.

ALTER SYSTEM SET JOB_QUEUE_PROCESSES = 20;

If the new value is lower than the previous setting and less than the number of currently executing Jnnn processes, the excess processes are allowed to complete before they are terminated.

Jnnn processes will not execute jobs if the instance is running in restricted mode.

See also:

"Restricting Access to an Open Database" for information about enabling and disabling restricted mode

Managing Job Queues

This section describes the various aspects of managing job queues and contains the following topics:

The DBMS_JOB Package

To schedule and manage jobs in the job queue, use the procedures in the DBMS_JOB package. There are no database privileges associated with using job queues. Any user who can execute the job queue procedures can use the job queue.

The following are procedures of the DBMS_JOB package. They are described in this section as noted.

Procedure Description

SUBMIT

Submits a job to the job queue. See "Submitting a Job to the Job Queue".

REMOVE

Removes a specified job from the job queue. See "Removing a Job from the Job Queue".

CHANGE

Alters a specified job that has already been submitted to the job queue. You can alter the job description, the time at which the job will be run, or the interval between executions of the job. See "Altering a Job".

WHAT

Alters the job description for a specified job. See "Altering a Job".

NEXT_DATE

Alters the next execution time for a specified job. See "Altering a Job".

INTERVAL

Alters the interval between executions for a specified job. See "Altering a Job".

BROKEN

Sets or resets the job broken flag. If a job is marked as broken, Oracle does not attempt to execute it. See "Broken Jobs".

RUN

Forces a specified job to run. See "Forcing a Job to Execute".

See Also:

Submitting a Job to the Job Queue

To submit a new job to the job queue, use the SUBMIT procedure in the DBMS_JOB package. You specify the following parameters with the SUBMIT procedure:

Parameter Description

JOB

An output parameter. This is the identifier assigned to the job you are creating. You must use this job number whenever you want to alter or remove the job. See "Job Number".

WHAT

This is the PL/SQL code you want to have executed. See "Job Definition".

NEXT_DATE

This is the next date when the job will be run. The default value is SYSDATE.

INTERVAL

This is the date function that calculates the next time to execute the job. The default value is NULL. INTERVAL must evaluate to a future point in time or NULL. See "Job Execution Interval".

NO_PARSE

This is a flag. If NO_PARSE is set to FALSE (the default), Oracle parses the procedure associated with the job. If NO_PARSE is set to TRUE, Oracle parses the procedure associated with the job the first time that the job is executed. If, for example, you want to submit a job before you have created the tables associated with the job, set NO_PARSE to TRUE.

For example, consider the following statements that submit a new job to the job queue, then prints the job number. The job calls the procedure DBMS_DDL.ANALYZE_OBJECT to generate statistics for the table hr.employees. The statistics are based on a sample of half the rows of the employees table. The job is run every 24 hours.

VARIABLE jobno NUMBER 
BEGIN
   DBMS_JOB.SUBMIT(:jobno, 
      'DBMS_DDL.ANALYZE_OBJECT(''TABLE'',
      ''HR'', ''EMPLOYEES'', 
      ''ESTIMATE'', NULL, 50);', 
      SYSDATE, 'SYSDATE + 1');
   COMMIT;
END;
/
PRINT jobno

JOBNO
----------
14144

Note:

For the submitted job to run, you must issue a COMMIT statement immediately after the DBMS_JOB.SUBMIT statement.


Job Environment

When you submit a job to the job queue or alter a job's definition, Oracle records the following environment characteristics:

Oracle also records the following NLS parameters:

Oracle restores all of these environment characteristics every time a job is executed. NLS_LANGUAGE and NLS_TERRITORY parameters determine the defaults for unspecified NLS parameters.

You can change a job's environment by using the DBMS_SQL package and the ALTER SESSION statement.

See Also:

Jobs and Import/Export

Jobs can be exported and imported. Thus, if you define a job in one database, you can transfer it to another database. When exporting and importing jobs, the job's number, environment, and definition remain unchanged.


Note:

If the job number of a job you want to import matches the number of a job already existing in the database, you will not be allowed to import that job. Submit the job as a new job in the database.


Job Owner

When you submit a job to the job queue, Oracle identifies you as the owner of the job. Only a job's owner can alter the job, force the job to run, or remove the job from the queue.

Job Number

A queued job is identified by its job number. When you submit a job, its job number is automatically generated from the JOBSEQ sequence owned by user SYS. Once a job is assigned a job number, that number does not change. Even if the job is exported and imported, its job number remains the same.

Job Definition

The job definition is the PL/SQL code specified in the WHAT parameter of the SUBMIT procedure. Normally, the job definition is a single call to a procedure. The procedure call can have any number of parameters.


Note:

In the job definition, use two single quotation marks around strings. Always include a semicolon at the end of the job definition.


The following are examples of valid job definitions:

Job Execution Interval

If a job should be executed periodically at a set interval, use a date expression similar to 'SYSDATE + 7' in the INTERVAL parameter. Below are shown some common date expressions used for job execution intervals.

Date Expression Evaluation
'SYSDATE + 7'

Exactly seven days from the last execution

'SYSDATE + 1/48'

Every half hour

'NEXT_DAY(TRUNC(SYSDATE), ''MONDAY'') + 15/24'

Every Monday at 3PM

'NEXT_DAY(ADD_MONTHS(TRUNC(SYSDATE, ''Q''), 3), ''THURSDAY'')'

First Thursday of each quarter


Note:

When specifying NEXT_DATE or INTERVAL, remember that date literals and strings must be enclosed in single quotation marks. Also, the value of INTERVAL must be enclosed in single quotation marks.


The INTERVAL date function is evaluated immediately before a job is executed. When the job completes successfully, the date calculated from INTERVAL becomes the new NEXT_DATE. For example, if you set the execution interval to 'SYSDATE + 7' on Monday, but for some reason (such as a network failure) the job is not executed until Thursday, 'SYSDATE + 7' then executes every Thursday, not Monday. If the INTERVAL date function evaluates to NULL and the job completes successfully, the job is deleted from the queue.

If you always want to automatically execute a job at a specific time, regardless of the last execution (for example, every Monday), the INTERVAL and NEXT_DATE parameters should specify a date expression similar to 'NEXT_DAY(TRUNC(SYSDATE), ''MONDAY'')'.

Database Links and Jobs

If you submit a job that uses a database link, the link must include a username and password. Anonymous database links will not succeed.

How Jobs Execute

Jnnn processes execute jobs. To execute a job, the process creates a session to run the job. When a Jnnn process runs a job, the job is run in the same environment in which it was submitted and with the owner's default privileges. The owner must be explicitly granted the necessary object privileges for all objects referenced within the job definition.

When you force a job to run using the procedure DBMS_JOB.RUN, the job is run by your user process and with your default privileges only. Privileges granted to you through roles are unavailable. You must be explicitly granted the necessary object privileges for all objects referenced within the job definition.

Job Queue Locks

Oracle uses job queue locks to ensure that a job is executed in only one session at a time. When a job is being run, its session acquires a job queue (JQ) lock for that job. You can use the locking views in the data dictionary to examine information about locks currently held by sessions.

The following query lists the session identifier, lock type, and lock identifiers for all sessions holding JQ locks:

SELECT SID, TYPE, ID1, ID2
   FROM V$LOCK
   WHERE TYPE = 'JQ';

      SID TY       ID1       ID2
--------- -- --------- ---------
       12 JQ         0     14144
1 row selected.

In the query above, the identifier for the session holding the lock is 12. The ID1 column is always 0 for JQ locks. The ID2 column is the job number of the job the session is running. This view can be joined with the DBA_JOBS_RUNNING view to obtain more information about the job.

See Also:

Job Execution Errors

When a job fails, information about the failure is recorded in a trace file and the alert log. Oracle writes message number ORA-12012 and includes the job number of the failed job.

The following can prevent the successful execution of queued jobs:

If a job returns an error while Oracle is attempting to execute it, Oracle tries to execute it again. The first attempt is made after one minute, the second attempt after two minutes, the third after four minutes, and so on, with the interval doubling between each attempt. If the job fails 16 times, Oracle automatically marks the job as broken and no longer tries to execute it. However, between attempts, you have the opportunity to correct the problem that is preventing the job from running. This will not disturb the retry cycle, and Oracle will eventually attempt to run the job again.

Removing a Job from the Job Queue

To remove a job from the job queue, use the REMOVE procedure in the DBMS_JOB package.

The following statements remove job number 14144 from the job queue:

BEGIN
DBMS_JOB.REMOVE(14144);
END;
/
Restrictions:

Altering a Job

To alter a job that has been submitted to the job queue, use the procedures CHANGE, WHAT, NEXT_DATE, or INTERVAL in the DBMS_JOB package.

Restriction:

CHANGE

You can alter any of the user-definable parameters associated with a job by calling the DBMS_JOB.CHANGE procedure.

In this example, job number 14144 is altered to execute every three days:

BEGIN
DBMS_JOB.CHANGE(14144, NULL, NULL, 'SYSDATE + 3');
END;
/

If you specify NULL for WHAT, NEXT_DATE, or INTERVAL when you call the procedure DBMS_JOB.CHANGE, the current value remains unchanged.


Note:

When you change a job's definition using the WHAT parameter in the procedure DBMS_JOB.CHANGE, Oracle records your current environment. This becomes the new environment for the job.


WHAT

You can alter the definition of a job by calling the DBMS_JOB.WHAT procedure.

The following example changes the definition for job number 14144:

BEGIN
DBMS_JOB.WHAT(14144, 
      'DBMS_DDL.ANALYZE_OBJECT(''TABLE'',
      ''HR'', ''DEPARTMENTS'', 
      ''ESTIMATE'', NULL, 50);');
END;
/

Note:

When you execute the procedure DBMS_JOB.WHAT, Oracle records your current environment. This becomes the new environment for the job.


NEXT_DATE

You can alter the next execution time for a job by calling the DBMS_JOB.NEXT_DATE procedure, as shown in the following example:

BEGIN
DBMS_JOB.NEXT_DATE(14144, SYSDATE + 4);
END;
/

INTERVAL

The following example illustrates changing the execution interval for a job by calling the DBMS_JOB.INTERVAL procedure:

BEGIN
DBMS_JOB.INTERVAL(14144, 'NULL');
END;
/

In this case, the job will not run again after it successfully executes and it will be deleted from the job queue.

Broken Jobs

A job is labeled as either broken or not broken. Oracle does not attempt to run broken jobs. However, you can force a broken job to run by calling the procedure DBMS_JOB.RUN.

How a Job Becomes Broken

When you submit a job it is considered not broken.

There are two ways a job can break:

Once a job has been marked as broken, Oracle will not attempt to execute the job until you either mark the job as not broken, or force the job to be executed by calling the procedure DBMS_JOB.RUN.

The following example marks job 14144 as not broken and sets its next execution date to the following Monday:

BEGIN
DBMS_JOB.BROKEN(14144, FALSE, NEXT_DAY(SYSDATE, 'MONDAY'));
END;
/
Restriction:

Running Broken Jobs

If a problem has caused a job to fail 16 times, Oracle marks the job as broken. Once you have fixed this problem, you can run the job by either:

If you force the job to run by calling the procedure DBMS_JOB.RUN, Oracle runs the job immediately. If the job succeeds, then Oracle labels the job as not broken and resets its count of the number of failed executions for the job to zero.

Once you reset a job's broken flag (by calling either RUN or BROKEN), job execution resumes according to the scheduled execution intervals set for the job.

Forcing a Job to Execute

There may be times when you would like to manually execute a job. For example, if you have fixed a broken job, you may want to test the job immediately by forcing it to execute. To force a job to execute immediately, use the procedure RUN in the DBMS_JOB package.

When you run a job using DBMS_JOB.RUN, Oracle recomputes the next execution date. For example, if you create a job on a Monday with a NEXT_DATE value of SYSDATE and an INTERVAL value of 'SYSDATE + 7', the job is run every 7 days starting on Monday. However, if you execute RUN on Wednesday, the next execution date will be set to the next Wednesday.

The following statement runs job 14144 in your session and recomputes the next execution date:

BEGIN
DBMS_JOB.RUN(14144);
END;
/

Note:

When you force a job to run, the job is executed in your current session. Running the job reinitializes your session's packages.


Restrictions:

Terminating a Job

You can terminate a running job by marking the job as broken, identifying the session running the job, and disconnecting that session. You should mark the job as broken, so that Oracle does not attempt to run the job again.

After you have identified the session running the job (using V$SESSION or V$LOCK, as shown earlier), you can disconnect the session using the SQL statement ALTER SYSTEM. For examples of viewing information about jobs and sessions, see the next section, "Viewing Job Queue Information".

See Also:

Viewing Job Queue Information

You can view information about jobs in the job queue using the data dictionary views listed below:

View Description

DBA_JOBS

ALL_JOBS

USER_JOBS

DBA view describes all the jobs in the database. ALL view describes all jobs that are accessible to the current user. USER view describes all jobs owned by the current user.

DBA_JOBS_RUNNING

Lists all jobs in the database that are currently running. This view can be joined with V$LOCK to identify jobs that have locks.

Displaying Information About a Job

The following query creates a listing of the job number, next execution time, failure count, and broken status for each job you have submitted:

SELECT JOB, NEXT_DATE, NEXT_SEC, FAILURES, BROKEN
   FROM DBA_JOBS;

JOB      NEXT_DATE  NEXT_SEC  FAILURES  B
-------  ---------  --------  --------  -
   9125  01-JUN-01  00:00:00         4  N
  14144  24-OCT-01  16:35:35         0  N
   9127  01-JUN-01  00:00:00        16  Y
3 rows selected.

Displaying Information About Running Jobs

You can also display information about only the jobs currently running. The following query lists the session identifier, job number, user who submitted the job, and the start times for all currently running jobs:

SELECT SID, r.JOB, LOG_USER, r.THIS_DATE, r.THIS_SEC
  FROM DBA_JOBS_RUNNING r, DBA_JOBS j
  WHERE r.JOB = j.JOB;

SID        JOB        LOG_USER      THIS_DATE  THIS_SEC
-----  ----------   -------------   ---------  --------
   12       14144   HR              24-OCT-94  17:21:24
   25        8536   QS              24-OCT-94  16:45:12
2 rows selected.
See Also:

Oracle9i Database Reference for more information on data dictionary views


Go to previous page Go to next page
Oracle
Copyright © 2001, 2002 Oracle Corporation.

All Rights Reserved.
Go To Documentation Library
Home
Go To Product List
Book List
Go To Table Of Contents
Contents
Go To Index
Index

Master Index

Feedback