https://www.cnblogs.com/yjmyzz/p/how-to-use-job-in-oracle.htmlhtml
oracle的job,實際上就是數據庫內置的定時任務,相似代碼中的Timer功能。下面是使用過程:sql
這裏咱們模擬一個場景:定時調用存儲過程P_TEST_JOB 向表TEST_JOB_LOG中插入數據數據庫
表結構:oracle
複製代碼 1 create table TEST_JOB_LOG 2 ( 3 rec_id NUMBER not null, 4 occr_time DATE 5 ); 6 alter table TEST_JOB_LOG 7 add constraint PK_TEST_JOB primary key (REC_ID); 複製代碼 序列:htm
複製代碼 1 create sequence SEQ_TEST_JOB_LOG 2 minvalue 1 3 maxvalue 99999999 4 start with 1 5 increment by 1 6 cache 10; 複製代碼 存儲過程:blog
1 create or replace procedure P_TEST_JOB is 2 begin 3 insert into test_job_log(rec_id, occr_time) values(seq_test_job_log.nextval,sysdate); 4 commit; 5 end P_TEST_JOB; 上面只是準備工做,下面纔是重點:(如下腳本全是pl/sql developer環境)rem
一、建立job字符串
按 Ctrl+C 複製代碼get
declare job_id number; begin sys.dbms_job.submit(job_id, 'P_TEST_JOB;', sysdate, 'sysdate+1/1440'); --立刻運行,而後每分鐘運行一次 sys.dbms_output.put_line(job_id); --輸出job Id end; 按 Ctrl+C 複製代碼 每一個job建立後,都會對應一個惟一的數字,在pl/sql的output面板裏,能夠看到dbms_output.put_line輸出的job id值。博客
二、查看job運行狀況
1 select * from dba_jobs; --須要dba權限 2 select * from dba_jobs_running; --須要dba權限 3 select * from all_jobs;
4 select * from user_jobs; 三、刪除job
begin dbms_job.remove(108); --108爲具體的job ID,能夠經過select * from user_jobs查詢獲得 end; 四、手動啓動job
1 begin 2 dbms_job.run(109);--運行指定Job 3 end; 最後,再給幾個關於建立job的小例子:
a、帶參數的存儲過程調用
複製代碼 1 declare 2 job_id number; 3 begin 4 sys.dbms_job.submit(job_id, 'P_JOB_XXX(sysdate-30,sysdate);', sysdate, 'trunc(sysdate+1)+(460)/(2460)'); --天天早上4:00運行 5 sys.dbms_output.put_line(job_id); --輸出job Id 6 end; 複製代碼 這裏指定了P_JOB_CKG的傳入參數爲sysdate及sysdate-30,若是是字符串參數,須要加二個單引號,相似 'P_XXX(''參數值'');'
此外,單引號還能夠用CHR(39)來代替,例如:
複製代碼 1 DECLARE 2 JOB_ID NUMBER; 3 BEGIN 4 SYS.DBMS_JOB.SUBMIT(JOB_ID, 5 'P_JOB_XXX(TO_DATE(' || chr(39) || 6 '2014-2-12 00:00:00' || chr(39) || ', ' || chr(39) || 7 'YYYY-MM-DD HH24:MI:SS' || chr(39) || '),TO_DATE(' || 8 chr(39) || '2014-2-12 23:59:59' || chr(39) || ', ' || 9 chr(39) || 'YYYY-MM-DD HH24:MI:SS' || chr(39) || 10 '));', 11 TO_DATE('2015-1-6 10:00:00', 'YYYY-MM-DD HH24:MI:SS'), 12 'SYSDATE+10/(60*24)'); --2015-01-06 10:00:00 開始執行,每10分鐘執行一次 13 SYS.DBMS_OUTPUT.PUT_LINE(JOB_ID); --輸出JOB ID
14 END; 複製代碼 中間那一串噁心的拼接,無非是要獲得字符串:
P_JOB_XXX(TO_DATE('2014-2-12 00:00:00', 'YYYY-MM-DD HH24:MI:SS'),TO_DATE('2014-2-12 23:59:59', 'YYYY-MM-DD HH24:MI:SS'));
b、關於指定時間的表達式示例
天天運行一次 'SYSDATE + 1'
每小時運行一次 'SYSDATE + 1/24'
每10分鐘運行一次
'SYSDATE + 10/(60*24)'
每30秒運行一次
'SYSDATE + 30/(602460)'
每隔一星期運行一次
'SYSDATE + 7'
每月最後一天運行一次
'TRUNC(LAST_DAY(ADD_MONTHS(SYSDATE,1))) + 23/24'
每一年1月1號零時
'TRUNC(LAST_DAY(TO_DATE(EXTRACT(YEAR FROM SYSDATE)||'12'||'01','YYYY-MM-DD'))+1)'
天天午夜12點
'TRUNC(SYSDATE + 1)'
天天早上8點30分
'TRUNC(SYSDATE + 1) + (860+30)/(2460)'
每星期二中午12點
'NEXT_DAY(TRUNC(SYSDATE ), ''TUESDAY'' ) + 12/24'
每月第一天的午夜12點
'TRUNC(LAST_DAY(SYSDATE ) + 1)'
每月最後一天的23點
'TRUNC (LAST_DAY (SYSDATE)) + 23 / 24'
每一個季度最後一天的晚上11點
'TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), 'Q' ) -1/24'
每星期六和日早上6點10分
'TRUNC(LEAST(NEXT_DAY(SYSDATE, ''SATURDAY"), NEXT_DAY(SYSDATE, "SUNDAY"))) + (660+10)/(2460)'
做者:菩提樹下的楊過 出處:http://yjmyzz.cnblogs.com 本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利。