|
- DELIMITER $
- DROP FUNCTION IF EXISTS `syant`.`STR_ADD_INT`$
- CREATE DEFINER=`root`@`%` FUNCTION `STR_ADD_INT`(
- P_start VARCHAR(50),
- P_add int,
- p_format VARCHAR(50)
- ) RETURNS varchar(25) CHARSET utf8
- DETERMINISTIC
- BEGIN
- /*
- 该函数用于字符串加十进制数字,返回字符串
- */
- DECLARE l_div INT; -- 被除数
- DECLARE L_FORMAT VARCHAR(50);
- DECLARE L_FORMAT_LEN INT;
- DECLARE l_mod VARCHAR(1); -- 模值-字符
- DECLARE l_imod int; -- 模值-数字
- DECLARE l_idata int;
- DECLARE l_istep int;
- DECLARE l_ij int; -- 进位
- DECLARE l_str VARCHAR(25);
- DECLARE l_char varchar(1);
-
-
- SET L_FORMAT=P_FORMAT;
- SET L_FORMAT_LEN=LENGTH(L_FORMAT);
- IF(P_add<0 OR L_FORMAT_LEN<8 OR L_FORMAT IS NULL )THEN
- RETURN "";
- END IF;
- IF(P_add=0)THEN
- RETURN P_start;
- END IF;
- IF(P_add>10000000)THEN -- 防呆
- RETURN P_start;
- END IF;
-
- SET l_istep=length(p_start);
- SET l_str='';
- SET l_div=P_add;
- WHILE l_div > 0 DO
- -- 获得被加数
- if(l_istep>0)then
- set l_char:=SUBSTR(p_start,l_istep,1);
- SET l_idata:=INSTR(L_FORMAT,l_char)-1;
- if(l_idata<0)then
- set l_idata=0;
- end if;
- else
- set l_idata=0;
- end if;
- -- 获得加数
- SET l_imod:=MOD(l_div, L_FORMAT_LEN) ;
- -- 获得进位
- set l_ij:=0;
- set l_imod:=l_imod+l_idata;
- if(l_imod>=l_format_len)then
- set l_ij:=1;
- set l_imod:=MOD(l_imod, L_FORMAT_LEN);
- end if;
-
- -- 获得数字对应的字母
- SET l_mod:=SUBSTR(L_FORMAT, l_imod + 1, 1);
- SET l_str:=CONCAT(l_mod,l_str);
- SET l_div=TRUNCATE(l_div/L_FORMAT_LEN,0) + l_ij;
- SET l_istep:=l_istep-1;
- END WHILE;
- -- 继续,可能有前辍
- if(l_istep>0)then
- SET l_str:=CONCAT(substr(p_start,1,l_istep),l_str);
- end if;
- RETURN l_str;
-
- END$
- DELIMITER ;
复制代码 |
|