Oracle

停止長時間執行的計劃作業

  • March 23, 2019

我需要在晚上 12 點啟動一個預定的作業,並保持該作業執行 8 小時。現在發生的情況是作業執行超過 12 個小時,我真的需要避免執行這麼長時間。我已經使用了該Max Run Duration選項,但它對我的目的沒有預期的效果。如果有人能給我一個應該如何做的例子,我將不勝感激。數據庫是 Oracle 12c。我把腳本放在這裡:

BEGIN
 SYS.DBMS_SCHEDULER.CREATE_JOB
   (
      job_name        => 'SYS.POB_TB_JOB'
     ,start_date      => TO_TIMESTAMP_TZ('2019/02/10 00:05:00.000000 America/New_York','yyyy/mm/dd hh24:mi:ss.ff tzr')
     ,repeat_interval => 'FREQ=DAILY;BYDAY=MON,TUE,WED,THU,FRI,SAT,SUN'
     ,end_date        => NULL
     ,job_class       => 'DEFAULT_JOB_CLASS'
     ,job_type        => 'STORED_PROCEDURE'
     ,job_action      => 'SELLER.FILL_TB_S1'
     ,comments        => NULL
   );

 SYS.DBMS_SCHEDULER.SET_ATTRIBUTE
   ( name      => 'SYS.POB_TB_JOB'
    ,attribute => 'MAX_RUN_DURATION'
    ,value     => TO_DSINTERVAL('+000 05:00:00'));

 SYS.DBMS_SCHEDULER.SET_ATTRIBUTE
   ( name      => 'SYS.POB_TB_JOB'
    ,attribute => 'number_of_arguments'
    ,value     => 4);

 SYS.DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE
   ( job_name             => 'SYS.POB_TB_JOB'
    ,argument_position    => 1
    ,argument_value       => '30');

 SYS.DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE
   ( job_name             => 'SYS.POB_TB_JOB'
    ,argument_position    => 2
    ,argument_value       => 'N');

 SYS.DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE
   ( job_name             => 'SYS.POB_TB_JOB'
    ,argument_position    => 3
    ,argument_value       => 'N');

 SYS.DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE
   ( job_name             => 'SYS.POB_TB_JOB'
    ,argument_position    => 4
    ,argument_value       => '1');

 SYS.DBMS_SCHEDULER.ENABLE
   (name                  => 'SYS.POB_TB_JOB');
END;
/

屬性MAX_RUN_DURATION不會終止作業,它只會引發一個事件。

我創建了一個這樣的過程:

procedure SchedulerWatchdog(jobName in varchar2) is

cursor Jobs is
select job_name
from user_scheduler_jobs
where JOB_NAME = jobName
  AND STATE = 'RUNNING'
  AND systimestamp - LAST_START_DATE > MAX_RUN_DURATION;

begin
  for aJob in Jobs loop
     DBMS_SCHEDULER.STOP_JOB(JobName, FORCE => TRUE);
  end loop;
end;

通過調度程序作業執行此過程,可能每分鐘執行一次。

語境:

如果您需要讓作業繼續執行,直到從下午 12 點過去 8 小時,這是告訴作業執行暫停類型直到上午 8 點的方式

PROCEDURE SELLER.FILL_TB_S1 IS
BEGIN
  /* YOUR CODE */
  WHILE TO_CHAR(SYSDATE, 'HH24MI') != 800 LOOP NULL; END LOOP;
END;

引用自:https://dba.stackexchange.com/questions/232650