Many people have a dislike of Dbms_job. Setting the right parameters
requires good knowledge of the input parameters and you probably need a
calculator too! In Oracle 10g, a new package might make things easier. ....

What’s in a name 

If you check 10g’s data dictionary, you’ll find a new package by the name dbms_scheduler.
One of the most obvious improvements is the naming convention of the
functions in this package. DBMS_JOB.Submit is now named
DBMS_SCHEDULER.Create_job and DBMS_JOB.Run goes by the name
DBMS_SCHEDULER.Run_job. You may disagree, but I think the new names
make a lot more sense.

In control of intervals

Fortunately,
Oracle made major improvements in the most annoying flaw of DBMS_JOB:
defining the interval. For instance, if you want a job to start every
morning at 06:00 exactly, the parameter "interval" usually contains
something like ‘TRUNC(SYSDATE) + 1 + 21/24′. With DBMS_SCHEDULER, the new parameter "repeat_interval" is set to ‘FREQ=DAILY’. In combination with a start_date = ‘20-APR-2006 06:00′ the job starts at 06:00. Everyday at
06:00. And not at 06:10:14 because the previous run lasted 10 minutes
14 seconds and you entered an interval of "SYSDATE + 1".

Scheduler and program objects 

 Another notable thing is the option to create scheduler and program objects. This is quite interesting too, because now you can define a custom schedule which you can reuse in all jobs.

 This example creates a schedule which runs every hour on the half hour.

BEGIN  DBMS_SCHEDULER.create_schedule  ( schedule_name   => 'run_every_hour'  , start_date      => SYSTIMESTAMP  , repeat_interval => 'freq=hourly; byminute=30'  , end_date        => NULL  , comments        => 'This schedule starts every hour at the half hour'  ) ;END;/

Next step is creating a program object with parameters:

BEGIN  dbms_scheduler.create_program    ( program_name        => 'Exampleprogram'    , program_type        => 'STORED_PROCEDURE'    , program_action      => 'package.procedure'    , number_of_arguments => 1    , enabled             => FALSE    , comments            => 'A demo program object.' );

  dbms_scheduler.define_program_argument    ( program_name      => 'Exampleprogram'    , argument_position => 1    , argument_name     => 'parameter_1'    , argument_type => 'VARCHAR2'    , default_value => 'Scott'    ) ;    dbms_scheduler.enable( name => 'Exampleprogram' );END;/

Creating a job is now easier than ever:

BEGIN   DBMS_SCHEDULER.create_job  ( job_name      => 'Examplejob'  , program_name  => 'Exampleprogram'  , schedule_name => 'run_every_hour'  , enabled       => FALSE  , comments      => 'Job that starts according to predefined schedule'  ) ;
  dbms_scheduler.set_job_argument_value  ( job_name => 'Examplejob'  , argument_position => 1  , argument_value => 'Tiger' );

  dbms_scheduler.enable( 'Examplejob' );

  commit;    

END;
/
 

The parameter program_type can be one of the values:
‘PLSQL_BLOCK’, ‘STORED_PROCEDURE’ or ‘EXECUTABLE’.  With ‘executable’, dbms_scheduler allows to execute shell scripts and
executables.

Ooops…

Please
note that in Oracle 10g R1 there is a vulnerability in which user with
access to DBMS_SCHEDULER and the create job privilege are able to gain
DBA and remote OS rights. Pete Finnigan found the bug and there is a
patch available as described here.