系统中经常有一些编码需要生成,以下是生成编码的设计。
下面OPC,DB,EB生成编码的时候要求不带4。
通过调用函数的方式如:SELECT f_getmaxid(1)就可以得到对应的编码。
表设计:
CREATE TABLE `t_sys_maxid` (
`tagid` int(8) NOT NULL COMMENT '识别号',
`maxno` int(11) NOT NULL COMMENT '最大号',
`idlen` tinyint(4) NOT NULL COMMENT '最大号',
`idpre` varchar(4) NOT NULL COMMENT '前缀',
`isid` char(1) NOT NULL COMMENT '是否是字符ID',
PRIMARY KEY (`tagid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
调用函数:
DELIMITER $$
USE `weipansettlementdb0420`$$
DROP FUNCTION IF EXISTS `f_getmaxid`$$
CREATE DEFINER=`weipan_jy`@`%` FUNCTION `f_getmaxid`(p_tagid TINYINT) RETURNS VARCHAR(10) CHARSET utf8
MODIFIES SQL DATA
BEGIN
DECLARE v_idlen TINYINT; #总长度
DECLARE v_isid CHAR(1); #是否是ID
DECLARE v_i INT DEFAULT 1; #循环变量
DECLARE v_j INT DEFAULT 1; #循环变量
DECLARE v_num INT DEFAULT 1; #排除4的变量
DECLARE v_numlen INT; #排除4变量的长度
DECLARE v_index INT; #4出现的位置
DECLARE v_zerocnt INT; #加零数量
DECLARE v_id VARCHAR(10); #返回的ID;
DECLARE v_idpre VARCHAR(4); #前缀
UPDATE t_sys_maxid SET maxno=1+@mno:=maxno,isid=@isid:=isid
WHERE tagid=p_tagid;
SELECT idpre INTO v_idpre
FROM t_sys_maxid WHERE tagid=p_tagid;
IF (v_idpre='OPC' OR v_idpre='DB' OR v_idpre='EB') THEN
SET v_numlen=LENGTH(CONVERT(@mno+1,CHAR(10)));
SET v_index=LOCATE('4', CONVERT(@mno+1,CHAR(10)));
IF v_index > 0 THEN
SET v_index=v_numlen-v_index;
IF v_index > 0 THEN
WHILE v_j<=v_index DO
SET v_num=v_num*10;
SET v_j=v_j+1;
END WHILE;
END IF;
UPDATE t_sys_maxid SET maxno=maxno+v_num
WHERE tagid=p_tagid;
END IF;
END IF;
IF @isid='Y' THEN
SELECT idpre,idlen,isid INTO v_id,v_idlen,v_isid
FROM t_sys_maxid
WHERE tagid=p_tagid;
SET v_zerocnt=v_idlen-LENGTH(CONCAT(CONVERT(@mno,CHAR(10)),v_id));
WHILE v_i<=v_zerocnt DO
SET v_id=CONCAT(v_id,'0');
SET v_i=v_i+1;
END WHILE;
SET v_id=CONCAT(v_id,TRIM(CONVERT(@mno,CHAR(10))));
ELSE
SET v_id=TRIM(CONVERT(@mno,CHAR(10)));
END IF;
RETURN v_id;
END$$
DELIMITER ;