现在的位置: 首页 > 综合 > 正文

[Oracle]利用Job和Procedure进行项目自动编号

2013年10月13日 ⁄ 综合 ⁄ 共 1716字 ⁄ 字号 评论关闭

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

 

【上篇】
【下篇】

抱歉!评论已关闭.