自增序列号生成与重置
需求场景:生成自增的6位数(如:000001-999999),并且每年都要重新开始(000001开始)。
实现思路:Oracle创建自增序列、重置。
1、Oracle创建自增序列。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | --获取用户下的所有序列 select * from dba_sequences t where sequence_owner= 'BUSINESS' ; --创建自增序列 create sequence ZXG_SEQ increment by 1 start with 1 minvalue 0 maxvalue 999999 ; --修改序列 alter sequence ZXG_SEQ increment by 2 minvalue 0 maxvalue 999999 ; --删除序列 drop sequence ZXG_SEQ; --获取自增序列 select ZXG_SEQ.Nextval XLH from dual; --获取左侧补 0 :lpad( 'AAA' , 6 , '0' )序列 select lpad(ZXG_SEQ.Nextval, 6 , '0' ) XLH from dual; --获取右侧补 0 :rpad( 'AAA' , 6 , '0' )序列 select rpad(ZXG_SEQ.Nextval, 6 , '0' ) XLH from dual; |
2、序列重置
2.1、Oracle创建一个存储过程来重置序列号,Oracle定时器执行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | --查看存储过程 select object_name,object_type from dba_objects where object_type= 'PROCEDURE' and object_name = 'ZXG_SEQ_RESET' ; --删除储存过程 DROP PROCEDURE ZXG_SEQ_RESET; --创建储存过程重置序列号 CREATE OR REPLACE PROCEDURE ZXG_SEQ_RESET(v_seqname in varchar2) as --定义变量n n number( 10 ); --定义变量tsql tsql varchar2( 100 ); BEGIN --处理逻辑 execute immediate 'select ' ||v_seqname|| '.nextval from dual' into n; n:=-n; tsql:= 'alter sequence ' ||v_seqname|| ' increment by ' || n; execute immediate tsql; execute immediate 'select ' ||v_seqname|| '.nextval from dual' into n; tsql:= 'alter sequence ' ||v_seqname|| ' increment by 1' ; execute immediate tsql; --提交事务 commit; Exception When others then Dbms_output.Put_line(sqlerrm);--打印输出错误 Rollback;--回滚事务 END; |
1 2 3 4 5 6 7 | --定时器执行存储过程 declare ZXG_JOB number; begin dbms_job.submit(ZXG_JOB, 'ZXG_SEQ_RESET(' 'ZXG_SEQ' ');' ,ADD_MONTHS(trunc(sysdate, 'yyyy' ), 12 )+ 1 / 24 ); end commit; |
1 2 | 或:Oracle命令窗口执行脚本<br>--执行存储过程 exec ZXG_SEQ_RESET( 'ZXG_SEQ' );<br>--删除定时器<br>exec dbms_job.remove( 43 ); //select job,broken,what,interval,t.* from user_jobs t; |
2.2、JAVA代码里执行重置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | //定时器:每年1月1日00时01分00秒 @Scheduled (cron = "0 1 0 1 1 ?" ) public void resetSequence(){ this .resetSequenceByName( "ZXG_SEQ" ); } //重置序列号 private void resetSequenceByName(String sequencename){ //获取下一个序列号 XLH StringBuffer nextSeqSql = new StringBuffer(); nextSeqSql.append( "select " +sequencename+ ".nextval XLH from dual" ); List<Map<String, Object>> list = this .jdbcTemplate.queryForList(nextSeqSql.toString()); if (list.size() > 0 ) { //修改序列号递减 -XLH StringBuffer alertSeqSql = new StringBuffer(); alertSeqSql.append( "alter sequence " +sequencename+ " increment by -" +Integer.parseInt(list.get( 0 ).get( "XLH" ).toString())); this .jdbcTemplate.execute(alertSeqSql.toString()); //序列号重置为 0 this .jdbcTemplate.queryForList(nextSeqSql.toString()); //修改序列号递增 1 StringBuffer alertSeqToOneSql = new StringBuffer(); alertSeqToOneSql.append( "alter sequence " +sequencename+ " increment by 1 " ); this .jdbcTemplate.execute(alertSeqToOneSql.toString()); } } |
注:2.2 方式使用的持久层是 JdbcTemplate,Maven:
1 2 3 4 5 | <!-- jdbcTemplate --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?