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

本文介绍了如何在Oracle中利用DBMS_JOB包的SUBMIT函数创建任务,结合Procedure来每日生成并重置以日期+编号的流水号。通过示例展示了一个名为ISSUE_ID的Procedure,用于创建和删除DATE_SEQ序列,以及一个Job,该Job每天凌晨00:00执行Procedure进行重置。还列举了不同时间间隔的例子,如每日、每分钟、每周、每月、每季度和每半年执行的设定方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值