函數dbms_job.submit可以完成Oracle的定時任務。
dbms_job.submit的格式如下:
declare job1 number;
begin
dbms_job.submit(job =>輸出變量,是此任務在任務隊列中的編號,
what => 執行的任務的名稱及其輸入參數,
next_date => 任務執行的時間,
interval => 任務執行的時間間隔,)
commit;
end;
下面以一個實例進行闡述:
要生成一個以日期+xxx的流水號,並每天進行重置
Procedure
CREATE OR REPLACE PROCEDURE
ISSUE_ID AS
BEGIN
EXECUTE IMMEDIATE 'DROP SEQUENCE DATE_SEQ';
EXECUTE IMMEDIATE 'CREATE SEQUENCE DATE_SEQ START WITH 1 INCREMENT BY 1 MAXVALUE 999 MINVALUE 1 CYCLE NOCACHE ORDER ';
END ISSUE_ID;
/*序列號
CREATE SEQUENCE DATE_SEQ
START WITH 1
INCREMENT BY 1
MAXVALUE 999
CYCLE
NOCACHE
ORDER
INCREMENT BY: 指定序列號之間的間隔,該值可爲正的或負的整數,但不可爲0。序列爲升序。忽略該子句時,缺省值爲1。
START WITH:指定生成的第一個序列號。在升序時,序列可從比最小值大的值開始,缺省值爲序列的最小值。對於降序,序列可由比最大值小的值開始,缺省值爲序列的最大值。
MAXVALUE:指定序列可生成的最大值。
MINVALUE:指定序列的最小值。
CYCLE --循環
NOCACHE --不緩存(可避免產生值不連續的情況)
ORDER --保證按次序產生值
有了1-999的循環序列,就可以 TO_CHAR(DATE_SEQ.NEXTVAL)先將其轉換爲字符形式。 然後 LPAD(TO_CHAR(DATE_SEQ.NEXTVAL),3,'0')對其進行3位加'0'補齊長度。例如2,補齊爲002。 然後加上插入的日期(只要年月) TO_CHAR(SYSDATE,'YYYYMM')||LPAD(TO_CHAR(DATE_SEQ.NEXTVAL),3,'0') 然後就可以進行INSERT或者是其他操作
EX:INSERT INTO 表名(ID,字段1,字段2,字段3....) VALUES(TO_CHAR(SYSDATE,'YYYYMM')||LPAD(TO_CHAR(DATE_SEQ.NEXTVAL),3,'0'),字段1,字段2,字段3...)
*/
Job
declare Issue_job number;
begin
dbms_job.submit(Issue_job,'ISSUE_ID;',sysdate,'TRUNC(sysdate+1)');
commit;
end;
/*
sysdate:立即執行
TRUNC(sysdate+1 ):每天凌晨00:00進行重置
1)、 每分鐘執行
Interval => TRUNC(sysdate,'mi') + 1 / (24*60)
2)、 每天定時執行
例如:每天的凌晨2點執行
Interval => TRUNC(sysdate) + 1 +2 / (24)
3)、 每週定時執行
例如:每週一凌晨2點執行
Interval => TRUNC(next_day(sysdate,2))+2/24 --星期一,一週的第二天
4)、 每月定時執行
例如:每月1日凌晨2點執行
Interval =>TRUNC(LAST_DAY(SYSDATE))+1+2/24
5)、 每季度定時執行
例如每季度的第一天凌晨2點執行
Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 2/24
6)、 每半年定時執行
例如:每年7月1日和1月1日凌晨2點
Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+2/24
這樣即完成整個過程。
TIPS:
1. CREATE SEQUENCE 時需要注意權限問題,避免sequence無法創建。
2.執行後需進行COMMIT。