Force chain to start immediately after completion instead of on a timer
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';