深圳全飞鸿

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 595|回复: 0
打印 上一主题 下一主题

mysqlest发布函数STR_ADD_INT

[复制链接]

800

主题

1379

帖子

7704

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7704
跳转到指定楼层
楼主
发表于 2019-11-10 20:45:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. DELIMITER $

  2. DROP FUNCTION IF EXISTS `syant`.`STR_ADD_INT`$

  3. CREATE DEFINER=`root`@`%` FUNCTION `STR_ADD_INT`(
  4. P_start VARCHAR(50),
  5. P_add  int,
  6. p_format VARCHAR(50)
  7. ) RETURNS varchar(25) CHARSET utf8
  8.     DETERMINISTIC
  9. BEGIN
  10.    /*
  11.     该函数用于字符串加十进制数字,返回字符串
  12.    */
  13.         DECLARE l_div INT;  -- 被除数
  14.         DECLARE L_FORMAT VARCHAR(50);
  15.         DECLARE L_FORMAT_LEN INT;
  16.         DECLARE l_mod VARCHAR(1); -- 模值-字符
  17.         DECLARE l_imod int;        -- 模值-数字
  18.         DECLARE l_idata int;
  19.         DECLARE l_istep int;  
  20.         DECLARE l_ij  int; -- 进位
  21.         DECLARE l_str VARCHAR(25);
  22.         DECLARE l_char varchar(1);
  23.    
  24.    
  25.         SET L_FORMAT=P_FORMAT;
  26.         SET L_FORMAT_LEN=LENGTH(L_FORMAT);
  27.         IF(P_add<0 OR L_FORMAT_LEN<8 OR L_FORMAT IS NULL )THEN
  28.                 RETURN "";
  29.         END IF;
  30.         IF(P_add=0)THEN
  31.                 RETURN P_start;
  32.         END IF;
  33.         IF(P_add>10000000)THEN  -- 防呆
  34.                 RETURN P_start;
  35.         END IF;
  36.       
  37.         SET l_istep=length(p_start);
  38.         SET l_str='';
  39.         SET l_div=P_add;
  40.         WHILE l_div > 0 DO
  41.                 -- 获得被加数
  42.                 if(l_istep>0)then
  43.                         set l_char:=SUBSTR(p_start,l_istep,1);
  44.                         SET l_idata:=INSTR(L_FORMAT,l_char)-1;
  45.                         if(l_idata<0)then
  46.                                 set l_idata=0;
  47.                         end if;
  48.                 else
  49.                         set l_idata=0;
  50.                 end if;
  51.                 -- 获得加数
  52.                 SET l_imod:=MOD(l_div, L_FORMAT_LEN) ;
  53.                 -- 获得进位
  54.                 set l_ij:=0;
  55.                 set l_imod:=l_imod+l_idata;
  56.                 if(l_imod>=l_format_len)then       
  57.                         set  l_ij:=1;
  58.                         set l_imod:=MOD(l_imod, L_FORMAT_LEN);
  59.                 end if;
  60.           
  61.                 -- 获得数字对应的字母
  62.                 SET l_mod:=SUBSTR(L_FORMAT, l_imod + 1, 1);
  63.                 SET l_str:=CONCAT(l_mod,l_str);
  64.                 SET l_div=TRUNCATE(l_div/L_FORMAT_LEN,0) + l_ij;
  65.                 SET l_istep:=l_istep-1;
  66.         END WHILE;
  67.         -- 继续,可能有前辍
  68.         if(l_istep>0)then
  69.           SET l_str:=CONCAT(substr(p_start,1,l_istep),l_str);
  70.         end if;
  71.     RETURN l_str;

  72. END$

  73. DELIMITER ;
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|nagomes  

GMT+8, 2025-5-5 01:44 , Processed in 0.027727 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表