-
CREATE TABLE `sys_sequence_info` (
-
`seq_id` varchar(50) COLLATE utf8_bin NOT NULL COMMENT '序列ID',
-
`seq_name` varchar(100) COLLATE utf8_bin NOT NULL COMMENT '序列名称',
-
`seq_type` varchar(20) COLLATE utf8_bin NOT NULL DEFAULT 'default' COMMENT '序列类型,default,yymmdd,yyyymmdd,yyyymm,yyyy,yyyymmddhh,yyyymmddhhmi,yyyymmddhhmiss',
-
`seq_date_reset` varchar(10) COLLATE utf8_bin DEFAULT 'false' COMMENT '当序列类型为日期类型时,日期变化时,是否重置序列从开始值开始',
-
`start_number` int(11) NOT NULL DEFAULT '1' COMMENT '开始的数值',
-
`end_number` int(11) DEFAULT NULL COMMENT '结束的数值',
-
`current_number` int(11) DEFAULT '0' COMMENT '当前序列的数值',
-
`current_value` varchar(100) COLLATE utf8_bin DEFAULT NULL COMMENT '当前的结果值(不包含begin_string,end_string的数据)',
-
`seq_number_length` int(11) NOT NULL DEFAULT '0' COMMENT '序列号码长度(仅序列号的长度,若seq_type为日期类型,则不包含日期的长度)',
-
`padding_char` varchar(1) COLLATE utf8_bin NOT NULL DEFAULT '0' COMMENT '当长度不够seq_number_length时,进行字符填充所使用的字符',
-
`padding_direction` varchar(10) COLLATE utf8_bin NOT NULL DEFAULT 'left' COMMENT '长度不够时,填充的方向.left/right',
-
`begin_string` varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT '序列的前缀字符,默认空',
-
`end_string` varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT '序列的后缀字符,默认空',
-
`seq_remark` varchar(800) COLLATE utf8_bin DEFAULT NULL COMMENT '序列备注',
-
KEY `sys_sequence_info_seq_id_IDX` (`seq_id`) USING BTREE
-
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='系统序列表,用于生成序列号'
mysql自定义函数如下:
-
CREATE DEFINER=`peng`@`localhost` FUNCTION `mytest`.`F_GET_SEQ_ID`(in_seq_id varchar(50)) RETURNS varchar(100) CHARSET utf8 COLLATE utf8_bin
-
BEGIN
-
### 函数名称:F_GET_SEQ_ID
-
### author:程晓鹏
-
### date: 2018.12.19
-
### 说明:获取流水号
-
declare v_result varchar(100) DEFAULT ''; #结果值
-
-
declare v_seq_id varchar(50) DEFAULT '';
-
declare v_seq_name varchar(100);
-
declare v_seq_type varchar(20);
-
declare v_seq_date_reset varchar(10);
-
declare v_start_number int;
-
declare v_end_number int;
-
declare v_current_number int;
-
declare v_current_value varchar(100);
-
declare v_seq_number_length int;
-
declare v_padding_char varchar(1);
-
declare v_padding_direction varchar(10);
-
declare v_begin_string varchar(20);
-
declare v_end_string varchar(20);
-
declare v_seq_remark varchar(800);
-
-
declare v_my_seq_number int; #计算后的序列号值
-
declare v_tmp_padding_string varchar(100) DEFAULT '';
-
declare v_tmp_seq_number_len int;
-
declare v_tmp_result varchar(100) DEFAULT '';
-
declare v_date_format_str varchar(20) default ''; #日期格式化字符
-
declare v_current_date varchar(20);
-
declare v_tmp_seq_type varchar(20) default '';
-
-
#查询数据库,对各个字段进行赋值操作
-
select 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
-
from sys_sequence_info where seq_id = in_seq_id
-
into v_seq_id, v_seq_name, v_seq_type, v_seq_date_reset, v_start_number, v_end_number,
-
v_current_number, v_current_value, v_seq_number_length, v_padding_char,
-
v_padding_direction, v_begin_string, v_end_string, v_seq_remark;
-
-
if v_begin_string is null THEN
-
set v_begin_string = '';
-
end if;
-
-
if v_end_string is null THEN
-
set v_end_string = '';
-
end if;
-
-
if v_end_number is null THEN
-
set v_end_number = 2147483647; #当字段中end_number为null,则设置默认值
-
end if;
-
-
if v_seq_date_reset is null THEN
-
set v_seq_date_reset = 'false'; #默认为false
-
end if;
-
-
if LENGTH(v_seq_id) > 0 THEN
-
if v_current_number is NULL THEN
-
set v_my_seq_number = v_start_number; #当为null,则默认使用数据库中的开始的数值
-
else
-
set v_my_seq_number = v_current_number + 1; #使用下一个值
-
end if;
-
-
if v_end_number is not null THEN
-
if v_my_seq_number > v_end_number THEN
-
set v_my_seq_number = v_start_number; #当变更后数值大于最大值时,则使用开始的数值
-
end if;
-
end if;
-
-
set v_tmp_seq_type = LOWER(v_seq_type); #序列类型,转化位全小写的进行类型判断
-
if v_tmp_seq_type = 'default' then
-
set v_date_format_str = '';
-
elseif v_tmp_seq_type = 'yymmdd' THEN
-
set v_date_format_str = '%y%m%d';
-
elseif v_tmp_seq_type = 'yyyymmdd' THEN
-
set v_date_format_str = '%Y%m%d';
-
elseif v_tmp_seq_type = 'yyyymm' THEN
-
set v_date_format_str = '%Y%m';
-
elseif v_tmp_seq_type = 'yy' then
-
set v_date_format_str = '%y';
-
elseif v_tmp_seq_type = 'yyyy' THEN
-
set v_date_format_str = '%Y';
-
elseif v_tmp_seq_type = 'yyyymmddhh' THEN
-
set v_date_format_str = '%Y%m%d%H';
-
elseif v_tmp_seq_type = 'yyyymmddhhmi' then
-
set v_date_format_str = '%Y%m%d%H%i';
-
elseif v_tmp_seq_type = 'yyyymmddhhmiss' then
-
set v_date_format_str = '%Y%m%d%H%i%S';
-
else
-
set v_date_format_str = ''; #默认为空
-
end if;
-
-
if length(v_date_format_str) > 0 THEN
-
set v_current_date = DATE_FORMAT(NOW(),v_date_format_str); #当前日期
-
if lower(v_seq_date_reset) = 'true' THEN
-
if v_current_value is not null &&
-
LENGTH(v_current_value) > 0 &&
-
substring(v_current_value,1, length(v_current_date)) != v_current_date THEN
-
set v_my_seq_number = v_start_number; #设置当前的序列号位开始的数值
-
end if;
-
end if;
-
end if;
-
-
set v_tmp_seq_number_len = length(v_my_seq_number);
-
if v_seq_number_length > 0 && v_tmp_seq_number_len < v_seq_number_length THEN
-
while v_tmp_seq_number_len < v_seq_number_length DO
-
set v_tmp_padding_string = concat(v_tmp_padding_string, v_padding_char); #对于长度不够的,进行字符串填充
-
set v_tmp_seq_number_len = v_tmp_seq_number_len + 1;
-
end while;
-
end if;
-
-
if LOWER(v_padding_direction) = 'left' THEN
-
set v_result = concat(v_tmp_padding_string,v_my_seq_number);
-
else
-
set v_result = concat(v_my_seq_number,v_tmp_padding_string);
-
end if;
-
-
if length(v_date_format_str) > 0 THEN #当为日期类型时,添加日期数据
-
set v_result = concat(v_current_date, v_result);
-
end if;
-
-
set v_tmp_result = concat(v_begin_string,concat(v_result,v_end_string)); #拼接要返回字符串的前缀及后缀
-
#对数据库的数据进行更新操作
-
update sys_sequence_info set current_number = v_my_seq_number, current_value = v_result where seq_id = in_seq_id;
-
set v_result = v_tmp_result; #返回值采用含有前缀字符串,后缀字符串的值
-
end if;
-
-
return v_result;
-
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) |