[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。
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。
相关文章推荐
- 利用 Oracle EM 企业管理器 进行oracle SQL的优化(自动生成索引)
- 利用jenkins+svn进行项目自动部署(本机自动篇)
- Oracle利用Sequence和触发器Trigger实现Columns的Default自动编号(标识)
- 利用 Oracle EM 企业管理器 进行oracle SQL的优化(自动生成索引)
- 利用 Oracle EM 企业管理器 进行oracle SQL的优化(自动生成索引)
- 利用临时数据表完成SQL语句输出并进行自动编号
- Activiti+oracle 启动项目时不能自动建表或更新表的问题分析及解决办法
- 利用windows任务执行批处理,实现ORACLE自动备份、删除过早备份
- Oracle利用PIVOT和UNPIVOT进行行列转换
- Oracle job procedure 存储过程定时任务
- vs2005中利用自动生成数据集、ObjectDataSource、Gridview进行组合查询
- 利用第三方开源项目 EventBus 进行通信
- Oracle 中利用Procedure 发邮件...
- 利用SVN的post-commit钩子实现多项目自动同步
- 应用oracle job进行定时统计信息更新
- 第八周项目3 利用运算重载符进行分数的大小比较和计算
- Oracle job procedure 存储过程定时任务(转自hoojo)
- 利用SVN进行项目自动化部署_以Resin容
- oracle序列or自动编号
- redis配置读写分离以及利用哨兵sentinel进行自动主从切换