Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2545614
  • 博文数量: 308
  • 博客积分: 5547
  • 博客等级: 大校
  • 技术积分: 3782
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-24 09:47
个人简介

hello world.

文章分类

全部博文(308)

分类: Mysql/postgreSQL

2018-12-20 12:49:13


点击(此处)折叠或打开

  1. CREATE TABLE `sys_sequence_info` (
  2.   `seq_id` varchar(50) COLLATE utf8_bin NOT NULL COMMENT '序列ID',
  3.   `seq_name` varchar(100) COLLATE utf8_bin NOT NULL COMMENT '序列名称',
  4.   `seq_type` varchar(20) COLLATE utf8_bin NOT NULL DEFAULT 'default' COMMENT '序列类型,default,yymmdd,yyyymmdd,yyyymm,yyyy,yyyymmddhh,yyyymmddhhmi,yyyymmddhhmiss',
  5.   `seq_date_reset` varchar(10) COLLATE utf8_bin DEFAULT 'false' COMMENT '当序列类型为日期类型时,日期变化时,是否重置序列从开始值开始',
  6.   `start_number` int(11) NOT NULL DEFAULT '1' COMMENT '开始的数值',
  7.   `end_number` int(11) DEFAULT NULL COMMENT '结束的数值',
  8.   `current_number` int(11) DEFAULT '0' COMMENT '当前序列的数值',
  9.   `current_value` varchar(100) COLLATE utf8_bin DEFAULT NULL COMMENT '当前的结果值(不包含begin_string,end_string的数据)',
  10.   `seq_number_length` int(11) NOT NULL DEFAULT '0' COMMENT '序列号码长度(仅序列号的长度,若seq_type为日期类型,则不包含日期的长度)',
  11.   `padding_char` varchar(1) COLLATE utf8_bin NOT NULL DEFAULT '0' COMMENT '当长度不够seq_number_length时,进行字符填充所使用的字符',
  12.   `padding_direction` varchar(10) COLLATE utf8_bin NOT NULL DEFAULT 'left' COMMENT '长度不够时,填充的方向.left/right',
  13.   `begin_string` varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT '序列的前缀字符,默认空',
  14.   `end_string` varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT '序列的后缀字符,默认空',
  15.   `seq_remark` varchar(800) COLLATE utf8_bin DEFAULT NULL COMMENT '序列备注',
  16.   KEY `sys_sequence_info_seq_id_IDX` (`seq_id`) USING BTREE
  17. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='系统序列表,用于生成序列号'
mysql自定义函数如下:

点击(此处)折叠或打开

  1. CREATE DEFINER=`peng`@`localhost` FUNCTION `mytest`.`F_GET_SEQ_ID`(in_seq_id varchar(50)) RETURNS varchar(100) CHARSET utf8 COLLATE utf8_bin
  2. BEGIN
  3.     ### 函数名称:F_GET_SEQ_ID
  4.     ### author:程晓鹏
  5.     ### date: 2018.12.19
  6.     ### 说明:获取流水号
  7.     declare v_result varchar(100) DEFAULT ''; #结果值
  8.     
  9.     declare v_seq_id varchar(50) DEFAULT '';
  10.     declare v_seq_name varchar(100);
  11.     declare v_seq_type varchar(20);
  12.     declare v_seq_date_reset varchar(10);
  13.     declare v_start_number int;
  14.     declare v_end_number int;
  15.     declare v_current_number int;
  16.     declare v_current_value varchar(100);
  17.     declare v_seq_number_length int;
  18.     declare v_padding_char varchar(1);
  19.     declare v_padding_direction varchar(10);
  20.     declare v_begin_string varchar(20);
  21.     declare v_end_string varchar(20);
  22.     declare v_seq_remark varchar(800);
  23.    
  24.     declare v_my_seq_number int; #计算后的序列号值
  25.     declare v_tmp_padding_string varchar(100) DEFAULT '';
  26.     declare v_tmp_seq_number_len int;
  27.     declare v_tmp_result varchar(100) DEFAULT '';
  28.     declare v_date_format_str varchar(20) default ''; #日期格式化字符
  29.     declare v_current_date varchar(20);
  30.     declare v_tmp_seq_type varchar(20) default '';
  31.     
  32.    #查询数据库,对各个字段进行赋值操作
  33.    select seq_id, seq_name, seq_type, seq_date_reset, start_number, end_number,
  34.            current_number, current_value, seq_number_length, padding_char,
  35.            padding_direction, begin_string, end_string, seq_remark
  36.     from sys_sequence_info where seq_id = in_seq_id
  37.     into v_seq_id, v_seq_name, v_seq_type, v_seq_date_reset, v_start_number, v_end_number,
  38.     v_current_number, v_current_value, v_seq_number_length, v_padding_char,
  39.     v_padding_direction, v_begin_string, v_end_string, v_seq_remark;
  40.    
  41.     if v_begin_string is null THEN
  42.       set v_begin_string = '';
  43.     end if;
  44.   
  45.     if v_end_string is null THEN
  46.       set v_end_string = '';
  47.     end if;
  48.    
  49.    if v_end_number is null THEN
  50.      set v_end_number = 2147483647; #当字段中end_number为null,则设置默认值
  51.    end if;
  52.   
  53.    if v_seq_date_reset is null THEN
  54.      set v_seq_date_reset = 'false'; #默认为false
  55.    end if;
  56.     
  57.     if LENGTH(v_seq_id) > 0 THEN
  58.       if v_current_number is NULL THEN
  59.          set v_my_seq_number = v_start_number; #当为null,则默认使用数据库中的开始的数值
  60.       else
  61.          set v_my_seq_number = v_current_number + 1; #使用下一个值
  62.       end if;
  63.      
  64.       if v_end_number is not null THEN
  65.          if v_my_seq_number > v_end_number THEN
  66.            set v_my_seq_number = v_start_number; #当变更后数值大于最大值时,则使用开始的数值
  67.          end if;
  68.       end if;
  69.      
  70.      set v_tmp_seq_type = LOWER(v_seq_type); #序列类型,转化位全小写的进行类型判断
  71.      if v_tmp_seq_type = 'default' then
  72.        set v_date_format_str = '';
  73.      elseif v_tmp_seq_type = 'yymmdd' THEN
  74.        set v_date_format_str = '%y%m%d';
  75.      elseif v_tmp_seq_type = 'yyyymmdd' THEN
  76.        set v_date_format_str = '%Y%m%d';
  77.      elseif v_tmp_seq_type = 'yyyymm' THEN
  78.        set v_date_format_str = '%Y%m';
  79.      elseif v_tmp_seq_type = 'yy' then
  80.        set v_date_format_str = '%y';
  81.      elseif v_tmp_seq_type = 'yyyy' THEN
  82.        set v_date_format_str = '%Y';
  83.      elseif v_tmp_seq_type = 'yyyymmddhh' THEN
  84.        set v_date_format_str = '%Y%m%d%H';
  85.      elseif v_tmp_seq_type = 'yyyymmddhhmi' then
  86.        set v_date_format_str = '%Y%m%d%H%i';
  87.      elseif v_tmp_seq_type = 'yyyymmddhhmiss' then
  88.        set v_date_format_str = '%Y%m%d%H%i%S';
  89.      else
  90.        set v_date_format_str = ''; #默认为空
  91.      end if;
  92.     
  93.      if length(v_date_format_str) > 0 THEN
  94.        set v_current_date = DATE_FORMAT(NOW(),v_date_format_str); #当前日期
  95.        if lower(v_seq_date_reset) = 'true' THEN
  96.          if v_current_value is not null &&
  97.             LENGTH(v_current_value) > 0 &&
  98.             substring(v_current_value,1, length(v_current_date)) != v_current_date THEN
  99.            set v_my_seq_number = v_start_number; #设置当前的序列号位开始的数值
  100.          end if;
  101.        end if;
  102.      end if;
  103.     
  104.     set v_tmp_seq_number_len = length(v_my_seq_number);
  105.       if v_seq_number_length > 0 && v_tmp_seq_number_len < v_seq_number_length THEN
  106.         while v_tmp_seq_number_len < v_seq_number_length DO
  107.           set v_tmp_padding_string = concat(v_tmp_padding_string, v_padding_char); #对于长度不够的,进行字符串填充
  108.           set v_tmp_seq_number_len = v_tmp_seq_number_len + 1;
  109.         end while;
  110.       end if;
  111.      
  112.      if LOWER(v_padding_direction) = 'left' THEN
  113.        set v_result = concat(v_tmp_padding_string,v_my_seq_number);
  114.      else
  115.        set v_result = concat(v_my_seq_number,v_tmp_padding_string);
  116.      end if;
  117.     
  118.      if length(v_date_format_str) > 0 THEN #当为日期类型时,添加日期数据
  119.        set v_result = concat(v_current_date, v_result);
  120.      end if;
  121.      
  122.      set v_tmp_result = concat(v_begin_string,concat(v_result,v_end_string)); #拼接要返回字符串的前缀及后缀
  123.      #对数据库的数据进行更新操作
  124.      update sys_sequence_info set current_number = v_my_seq_number, current_value = v_result where seq_id = in_seq_id;
  125.      set v_result = v_tmp_result; #返回值采用含有前缀字符串,后缀字符串的值
  126.     end if;
  127.     
  128.     return v_result;
  129. END



向数据库插入一条数据:


?INSERT INTO sys_sequence_info (seq_id,seq_name,seq_type,seq_date_reset,start_number,end_number,current_number,current_value,seq_number_length,padding_char,padding_direction,begin_string,end_string,seq_remark) VALUES 
('1','test','default','true',1,20,8,'0008',4,'0','left',NULL,NULL,NULL);

?INSERT INTO sys_sequence_info (seq_id,seq_name,seq_type,seq_date_reset,start_number,end_number,current_number,current_value,seq_number_length,padding_char,padding_direction,begin_string,end_string,seq_remark); VALUES 
('2','test','yyyymmddhhmiss','false',1,15,6,'20181220113552000006',6,'0','left',NULL,NULL,NULL);

调用方式:
select F_GET_SEQ_ID('1');
select F_GET_SEQ_ID('2');

阅读(11683) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~