Oracle
停止長時間執行的計劃作業
我需要在晚上 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;