zoukankan      html  css  js  c++  java
  • 自增序列号生成与重置

    需求场景:生成自增的6位数(如:000001-999999),并且每年都要重新开始(000001开始)。

    实现思路:Oracle创建自增序列、重置。

        1、Oracle创建自增序列。

    --获取用户下的所有序列
    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定时器执行。

    --查看存储过程
    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;

         

    --定时器执行存储过程
    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;
    

      

    或:Oracle命令窗口执行脚本
    --执行存储过程 exec ZXG_SEQ_RESET('ZXG_SEQ');
    --删除定时器
    exec dbms_job.remove(43);//select job,broken,what,interval,t.* from user_jobs t;

      

           2.2、JAVA代码里执行重置

    //定时器:每年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:

    <!-- jdbcTemplate -->
    <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    

      

  • 相关阅读:
    day26
    day 25
    java.io.IOException: java.net.ConnectException: Call From master/192.168.58.128 to master:10020 failed on connection exception: java.net.ConnectException: 拒绝连接;
    疫情可视化系统
    使用eclipse创建spring cloud的eureka客户端和eureka服务端
    连接虚拟机的hive时进程自动杀死
    在Ubuntu18.04的Docker中安装Oracle镜像及简单使用
    Ubuntu16.04 上Docker 中安装SQL Server 2017
    docker
    Docker镜像报错
  • 原文地址:https://www.cnblogs.com/zxg-6/p/15020229.html
Copyright © 2011-2022 走看看