Force chain to start immediately after completion instead of on a timer Is it possible to force an Oracle chain to restart immediately after it finishes executing, instead of on a timer?  I have only found ways to do a temporal restart, which doesn't really work for me as this is a data warehouse that has varying times of completion and cannot be set to just run every X minutes.
The easiest way to do this is to add another step prior to the end of the chain that changes the job to start execution of the chain at SYSDATE + 1/1440.

Something like this:

CREATE OR REPLACE PROCEDURE move_next_execution
AS
BEGIN
    -- change to the correct job_id
    dbms_job.next_date(666,'sysdate+1/1440');
    -- need to commit so that the scheduler (which runs in a different session) can see it
    commit;
END;
/

sys.dbms_scheduler.create_program(
    program_name =&gt; 'PHIL.MOVE_EXEC',
    program_action =&gt; 'PHIL.move_next_execution',
    program_type =&gt; 'STORED_PROCEDURE',
    number_of_arguments =&gt; 0,
    comments =&gt; NULL,
    enabled =&gt; FALSE);

sys.DBMS_SCHEDULER.ENABLE(name=&gt;'PHIL.MOVE_EXEC');


(Untested, but will test it when I have time - unsure if the end of the chain &amp; job will again modify the next_date.)

I have tested the following, which works OK (but involves creating a new job):

-- schedule next execution
CREATE OR REPLACE PROCEDURE schedule_next_execution
AS
BEGIN
    -- not that job_name will have to be generated so it's unique each time
    DBMS_SCHEDULER.CREATE_JOB (
      job_name        =&gt; 'chain_job',
      job_type        =&gt; 'CHAIN',
      job_action      =&gt; 'CHAIN',
      start_date =&gt; systimestamp + interval '1' minute,
      enabled         =&gt; TRUE);

END;
/


-- just an example proc
CREATE OR REPLACE PROCEDURE do_nothing_for_2minutes
AS
BEGIN
  DBMS_LOCK.SLEEP(120);
END;
/


BEGIN
    sys.dbms_scheduler.create_program(
        program_name =&gt; 'PHIL.NOTHING',
        program_action =&gt; 'PHIL.do_nothing_for_2minutes',
        program_type =&gt; 'STORED_PROCEDURE',
        number_of_arguments =&gt; 0,
        comments =&gt; NULL,
        enabled =&gt; FALSE);

    sys.DBMS_SCHEDULER.ENABLE(name=&gt;'PHIL.NOTHING');   

    sys.dbms_scheduler.create_program(
        program_name =&gt; 'PHIL.SCHEDULE',
        program_action =&gt; 'PHIL.schedule_next_execution',
        program_type =&gt; 'STORED_PROCEDURE',
        number_of_arguments =&gt; 0,
        comments =&gt; NULL,
        enabled =&gt; FALSE);

    sys.DBMS_SCHEDULER.ENABLE(name=&gt;'PHIL.SCHEDULE');
END;
/

BEGIN
    sys.dbms_scheduler.create_chain(
        comments =&gt; 'example chain',
        chain_name =&gt; 'PHIL.CHAIN'
    );

    sys.dbms_scheduler.enable(name=&gt;'PHIL.CHAIN');
END;
/

BEGIN
    sys.DBMS_SCHEDULER.DEFINE_CHAIN_STEP  (
        CHAIN_NAME  =&gt; 'PHIL.CHAIN',
        STEP_NAME  =&gt; 'STEP1',
        PROGRAM_NAME =&gt; 'PHIL.NOTHING'  );
END;
/

BEGIN
    sys.DBMS_SCHEDULER.DEFINE_CHAIN_STEP  (
        CHAIN_NAME  =&gt; 'PHIL.CHAIN',
        STEP_NAME  =&gt; 'STEP2',
        PROGRAM_NAME =&gt; 'PHIL.SCHEDULE'  );
END;
/


BEGIN
    sys.DBMS_SCHEDULER.DEFINE_CHAIN_RULE  (
        CHAIN_NAME  =&gt; 'PHIL.CHAIN',
        condition =&gt; 'TRUE',
        action =&gt; 'START STEP1'
        );
END;
/

BEGIN
    sys.DBMS_SCHEDULER.DEFINE_CHAIN_RULE  (
        CHAIN_NAME  =&gt; 'PHIL.CHAIN',
        condition =&gt; 'STEP1 SUCCEEDED',
        action =&gt; 'START STEP2'
        );
END;
/

BEGIN
    sys.DBMS_SCHEDULER.DEFINE_CHAIN_RULE  (
        CHAIN_NAME  =&gt; 'PHIL.CHAIN',
        condition =&gt; 'STEP2 SUCCEEDED',
        action =&gt; 'END'
        );
END;
/

-- get timestamp
select systimestamp from dual;

-- run for first time
BEGIN
  DBMS_SCHEDULER.RUN_CHAIN (
    chain_name   =&gt; 'CHAIN',
    start_steps  =&gt; null );
END;
/

-- wait 2 mins
select DBMS_LOCK.SLEEP(120) from dual;

-- check for new job
select start_date from dba_jobs where job_name = 'CHAIN_JOB';