2017-05-11 19 views
1

Oracle For 루프에서 n 개의 작업을 만듭니다. 생성 된 각 작업의 시작 날짜는 이전 작업으로부터 10 초 간격입니다. 그러나 어떤 이유로 각 작업은 서로 1 초 이내에 시작됩니다. Oracle에서 향후 작업을 수행 할 수 없습니까? 내가 LTIMESTAMP 같은데요시작 날짜 매개 변수에 따라 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; 
+0

작성한 코드를 표시 할 수 있습니까? – Nitish

+0

일부 작업에 대해 DBA_SCHEDULER_JOB_RUN_DETAILS에서 'LOG_DATE, REQ_START_DATE, ACTUAL_START_DATE, RUN_DURATION'을 (를) 제공 할 수 있습니까? – JSapkota

답변

0

timestamp 데이터 형식 TIMESTAMP WITH TIME ZONE의 insted입니다. 자동 변환하는 동안 타임 스탬프의 정확성을 잃게됩니다.

스케줄러

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

내 경우에는 모든 JOBY 한 시간에 시작됩니다 당신이 내 서버에서 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; 

결과에서 시간대를 사용하는 세션에서 SELECT * FROM dba_scheduler_global_attribute WHERE attribute_name = 'DEFAULT_TIMEZONE';

에서 시간대를하는 사용 . start_date는 스케줄러의 현재 날짜보다 이전입니다.

+0

LTIMESTAMP 데이터 형식을 timestamp에서 TIMESTAMP WITH TIME ZONE으로 변경하려고 시도했지만 여전히 동일한 문제가 있습니다. –