[Oracle]利用Job和Procedure進行項目自動編號

函數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。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章