您的位置:首页 > 数据库 > Oracle

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

2011-08-08 12:31 351 查看
函数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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: