zoukankan      html  css  js  c++  java
  • mysql实现交易编码生成(代替oracle的序列)

    • 创建序列表
    
    drop table if exists sequence;
    
    create table sequence(
    seq_name varchar(50) not null comment '序列名称',
    current_val int not null comment '当前值',
    increment_val int not null default 1 comment '步长,默认为1',
    today_date date,
    primary key(seq_name,today_date)
    ) comment '序列表';
    
    • 插入第一个值
    insert into sequence(seq_name,current_val,increment_val,today_date) values('seq_transactionno',0,1,current_date)
    
    
    commit;
    
    select * from sequence;
    
    • 创建函数获取序列当前值
    drop function if exists seq_currentval;
    create function seq_currentval (v_seq_name varchar(50),v_date date)
    returns int(10)
    language sql
    deterministic
    contains sql
    sql security definer
    comment '获取传入序列当前值'
    begin
      declare v_value int;
    	set v_value=0;
      select current_val into v_value from sequence where seq_name=v_seq_name and today_date=v_date;
    	return v_value;
    end
    
    • 创建函数获取下一个值
    drop function if exists seq_nextval;
    create function seq_nextval(v_seq_name varchar(50),v_date date)
    returns int(10)
    language sql
    deterministic
    contains sql
    sql security definer
    comment '获取传入序列的下一个值'
    begin
    	update sequence 
    	set current_val=current_val+increment_val
    	where seq_name=v_seq_name and today_date=v_date;
    	return seq_currentval(v_seq_name,v_date);
    end;
    
    select seq_currentval('seq_transactionno',current_date)
    
    • 测试
    drop table if exists tt;
    create table tt(
    transactionno varchar(50),
    name varchar(50)
    )
    
    drop table if exists t1;
    create table t1(
    name varchar(50)
    )
    
    insert into t1(name) values('3')
    commit;
    
    select * from t1;
    select * from tt;
    
    insert into tt
    (transactionno,
    name
    )
    select get_today_transactionno('seq_transactionno',date'2020-11-11'),
           t1.name
    from t1
    
    
    
    select count(*) from sequence where seq_name='seq_transactionno' and today_date=CURRENT_DATE
    
    • 创建生成当前交易编码的函数
    drop function if exists get_today_transactionno;
    create function get_today_transactionno(v_seq_name varchar(50),v_date date)
    returns varchar(50)
    language sql
    deterministic
    contains sql
    sql security definer
    comment '获取当天的交易编号'
    begin
    	-- 序列赋初值,如果不存在,初始化
    	declare v_count int;
    	select count(*) into v_count from sequence where seq_name=v_seq_name and today_date=v_date;
    	if v_count<>1 then
    			insert into sequence(seq_name,current_val,increment_val,today_date) values(v_seq_name,0,1,v_date);
    	end if;
    	-- 返回格式化数据
    	return concat('000167',date_format(v_date,'%Y%m%d'),lpad(seq_nextval('seq_transactionno',v_date),10,0));
    end;
    
    -- 测试
    select  get_today_transactionno('seq_transactionno',date'2020-11-11');
    
  • 相关阅读:
    DB2数据库BACKUP PENDING状态(修改日志模式导致)(转)
    JAVA调用WebService实例
    eclipse启动报JVM terminated. Exit code=-1的解决方法
    JAVA使用Dom4j组装、解析XML
    任务调度IBM Tivoli Workload Scheduler(TWS)
    Java遍历Map数据的几种方式
    谈谈我对Log4j2以外的感想
    ESQL中添加JMS参数
    node.js-node-inspector调试
    前端-浏览器内核
  • 原文地址:https://www.cnblogs.com/nuochengze/p/14170352.html
Copyright © 2011-2022 走看看