随笔 - 65  文章 - 0  评论 - 3  阅读 - 10万

自增序列号生成与重置

需求场景:生成自增的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>

  

posted on   陌生街中吹起褪色故梦  阅读(821)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
< 2025年3月 >
23 24 25 26 27 28 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 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示