Задание Oracle не запускается в соответствии с параметром "Дата начала"

У меня есть цикл Oracle For, который создает n рабочих мест. Для каждого созданного задания начальная дата - это интервал 10 секунд с предыдущего задания. Но по какой-то причине каждая работа запускается в течение 1 секунды друг от друга. Будущие рабочие места не возможны в Oracle?

    LTIMESTAMP := SYSTIMESTAMP;

    FOR REC IN (SELECT *
                  FROM ORDERS
                 WHERE PROCESS_FLAG = CST_IS_ELIGIBLE_FOR_PROCESSING
                 ORDER BY ORDER_DATE ASC)
    LOOP

        LJOBNAME := CST_JOB_NAME_PREFIX || TO_CHAR(REC.ORDER_ID);

        DBMS_SCHEDULER.CREATE_PROGRAM(PROGRAM_NAME        => CST_PROGRAM_NAME,
                                      PROGRAM_ACTION      => 'PKG_BATCH_MAIN.SP_START_JOB',
                                      PROGRAM_TYPE        => 'STORED_PROCEDURE',
                                      NUMBER_OF_ARGUMENTS => 2,
                                      ENABLED             => FALSE);

        DBMS_SCHEDULER.DEFINE_PROGRAM_ARGUMENT(PROGRAM_NAME      => CST_PROGRAM_NAME,
                                               ARGUMENT_POSITION => 1,
                                               ARGUMENT_TYPE     => 'NUMBER');

        DBMS_SCHEDULER.DEFINE_PROGRAM_ARGUMENT(PROGRAM_NAME      => CST_PROGRAM_NAME,
                                               ARGUMENT_POSITION => 2,
                                               ARGUMENT_TYPE     => 'NUMBER');

        DBMS_SCHEDULER.ENABLE(CST_PROGRAM_NAME);

        DBMS_SCHEDULER.CREATE_JOB(JOB_NAME        => LJOBNAME,
                                  PROGRAM_NAME    => CST_PROGRAM_NAME,
                                  START_DATE      => LTIMESTAMP,
                                  REPEAT_INTERVAL => 'FREQ=SECONDLY; BYSECOND=1',
                                  END_DATE        => NULL,
                                  AUTO_DROP       => TRUE,
                                  ENABLED         => FALSE,
                                  COMMENTS        => 'Job launched for each ORDER detail id');

            DBMS_SCHEDULER.SET_ATTRIBUTE(LJOBNAME,
                                         'MAX_RUNS',
                                         1);

            DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(LJOBNAME,
                                                  1,
                                                  TO_CHAR(REC.ORDER_ID));
            DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(LJOBNAME,
                                                  2,
                                                  TO_CHAR(REC.ORDER_DETAILS_ID));

            DBMS_SCHEDULER.ENABLE(LJOBNAME);

            LTIMESTAMP := LTIMESTAMP + INTERVAL '10' SECOND;

    END LOOP;

1 ответ

Я предполагаю, что LTIMESTAMP timestamp тип данных TIMESTAMP WITH TIME ZONE, Во время автоконверсии вы теряете точность метки времени.

Планировщик использует часовой пояс от SELECT * FROM dba_scheduler_global_attribute WHERE attribute_name = 'DEFAULT_TIMEZONE';

В сеансе вы используете часовой пояс из SELECT sessiontimezone FROM DUAL;

declare
 with_timestamp  TIMESTAMP WITH TIME ZONE := systimestamp;
 no_timestamp    timestamp                  := with_timestamp;
 auto_conversion TIMESTAMP WITH TIME ZONE := no_timestamp;
begin 
 dbms_output.put_line(to_char(with_timestamp,'YYYY-MM-DD hh24:mi:ss TZR')); 
 dbms_output.put_line(to_char(no_timestamp,'YYYY-MM-DD hh24:mi:ss TZR'));
 dbms_output.put_line(to_char(auto_conversion,'YYYY-MM-DD hh24:mi:ss TZR'));

end;

Результаты с моего сервера

2017-05-11 09:15:44 +01:00
2017-05-11 09:15:44 +00:00
2017-05-11 09:15:44 +02:00

В моем случае все рабочие места начнутся через час. Ваша начальная дата более ранняя, чем текущая дата для планировщика.

Другие вопросы по тегам