再會。一點背景... 有一個 Oracle 12.2 資料庫。它使用了 DBMS_JOBS 包并使用了運算式 dbms_job.next_date (job, nvl (datetime, sysdate)); 最近將DB遷移到Oracle 19 請告訴我在DBMS_SCHEDULER 下一個開始的作業是如何出現的?是否可以更新下一次啟動的日期,從先前準備好的表或確定何時需要開始作業的函式中替換格式為“DD.MM.YYYY HH24:MI:SS”的日期?
uj5u.com熱心網友回復:
據我所知,那里沒有next_date。調度程式使用(如檔案所述)
豐富的日歷語法,使您能夠定義重復的計劃,例如“每周二和周五下午 4:00”或“每個月的第二個周三”。此日歷語法用于許多程式包子程式的 repeat_interval 引數中的日歷運算式。
據此,我不確定您是否可以輕松地將存盤在表中的日期“轉換”為這樣的日歷。
但是,您可以安排一個只運行一次的作業,一次從您的表中提取,并將其用作調度程式的start_date引數。
uj5u.com熱心網友回復:
在 DBMS_SCHEDULER 中,您甚至可以創建復雜的計劃時間,請參閱示例根據 Oracle SQL 中的營業時間計算小時數
你怎么跑dbms_job.next_date?也許不是設定作業的開始時間,只需使用DBMS_SCHEDULER.RUN_JOB(job_name, FALSE);.
或者創建一個沒有開始時間的調度程式作業
BEGIN
DBMS_SCHEDULER.CREATE_JOB
(
job_name => '<job_name>'
,start_date => NULL
,repeat_interval => NULL
,end_date => NULL
,job_class => 'DEFAULT_JOB_CLASS'
,job_type => 'PLSQL_BLOCK'
,job_action => '<PL/SQL procedure>'
);
DBMS_SCHEDULER.SET_ATTRIBUTE
( NAME => '<job_name>'
,attribute => 'AUTO_DROP'
,VALUE => FALSE);
END;
然后設定你想運行它的開始時間:
BEGIN
DBMS_SCHEDULER.SET_ATTRIBUTE
( name => '<job_name>'
,attribute => 'START_DATE'
,value => TIMESTAMP '2021-11-05 12:30:00');
END;
再說明一下, a DATEorTIMESTAMP沒有任何格式。這些值存盤為內部位元組值,您看到的是根據當前會話NLS_DATE_FORMAT/的(默認)輸出格式NLS_TIMESTAMP_FORMAT。您永遠不應該將日期/時間值存盤為字串,這是一個設計缺陷。
如果您只是想知道,當您的作業下次運行時,請運行以下查詢:
SELECT JOB_NAME, START_DATE, END_DATE, LAST_START_DATE, NEXT_RUN_DATE
FROM ALL_SCHEDULER_JOBS
WHERE JOB_NAME = '<job_name>';
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/349013.html
