MYSQL自定义数据库函数

         使用Mysql数据库的时候由于框架限制需要自定义数据库函数,写了几个数据库函数,简单做个记录吧

-- 启用log_bin_trust_function_creators: 此项操作之前需要检查log_bin_trust_function_creators的值
-- show variables like 'log_bin_trust_function_creators'; 
-- 结果为OFF执行如下set语句,为ON则不执行set语句
set global log_bin_trust_function_creators=1;
-- 创建将版本信息转换为字符串的函数VerToStr
-- INPUT: VerToStr("V1.02.03.40")  OUTPUT: 0001000200030040
DELIMITER //
DROP FUNCTION IF EXISTS VerToStr // 
CREATE FUNCTION VerToStr(ver varchar(20))
RETURNS varchar(50)
BEGIN
    DECLARE len int;
    DECLARE verstr varchar(50);
    DECLARE result varchar(50);
    
    SET len=LENGTH(ver)-LENGTH(REPLACE(ver,'.',''));
    -- Replace input version V and v
    SET verstr=REPLACE(REPLACE(ver,'V',''),'v','');

  IF len=0 then
      SET result=LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(verstr, '.', 1), '.', -1), 4, '0');
  ELSEIF len=1 then
      SET result=CONCAT(LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(verstr, '.', 1), '.', -1), 4, '0'),LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(verstr, '.', 2), '.', -1), 4, '0'));
  ELSEIF len=2 then
      SET result=CONCAT(LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(verstr, '.', 1), '.', -1), 4, '0'),LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(verstr, '.', 2), '.', -1), 4, '0'),LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(verstr, '.', 3), '.', -1), 4, '0'));
  ELSE
      SET result=CONCAT(LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(verstr, '.', 1), '.', -1), 4, '0'),LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(verstr, '.', 2), '.', -1), 4, '0'),LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(verstr, '.', 3), '.', -1), 4, '0'),LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(verstr, '.', 4), '.', -1), 4, '0'));
  END IF;
    
    RETURN result;
END //
DELIMITER ;

DELIMITER //
-- 获取拆分的某个字符串
-- INPUT: SPLIT_STR("abc_def_ghi",'_',1)  OUTPUT: abc
DROP FUNCTION IF EXISTS SPLIT_STR //
CREATE FUNCTION SPLIT_STR(
  x VARCHAR(255),
  delim VARCHAR(12),
  pos INT
) RETURNS VARCHAR(255)
BEGIN 
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
       LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
       delim, '');
END //
DELIMITER ;

DELIMITER //   
-- 获取拆分的个数
-- INPUT: func_get_split_string_total("abc_def_ghi",'_')  OUTPUT: 3
DROP FUNCTION IF EXISTS func_get_split_string_total //
CREATE FUNCTION func_get_split_string_total(  
    f_string varchar(1000),
    f_delimiter varchar(5)  
) RETURNS int(11)  
BEGIN  
  declare returnInt int(11);  
  if length(f_delimiter)=2  then  
     return 1+(length(f_string) - length(replace(f_string,f_delimiter,'')))/2;  
  else      
     return 1+(length(f_string) - length(replace(f_string,f_delimiter,'')));  
  end if; 
END //
DELIMITER ;

DELIMITER //  
-- 将原字符串拆分成带单引号和逗号连接的字符串
-- INPUT: SPLIT_LINETOOBJECT("abc,def,ghi",',')  OUTPUT: 'abd','def','ghi'
DROP FUNCTION IF EXISTS SPLIT_LINETOOBJECT //     
CREATE FUNCTION SPLIT_LINETOOBJECT(
  x VARCHAR(4000),
  delim VARCHAR(12)
) RETURNS VARCHAR(4000) 
BEGIN 
    DECLARE i int;
    DECLARE tempStr VARCHAR(260);
    DECLARE returnStr VARCHAR(4000); 
    set i = 1;  
    set returnStr = ""; 
    if(x is null or length(x)=0) then  
        return returnStr;  
    else  
        while i<=func_get_split_string_total(x,delim)  
          do  
          set tempStr = concat("'",SPLIT_STR(x,delim,i),"',");
          set returnStr = concat(returnStr,tempStr);
          set i = i+1;  
        end while;  
    set returnStr = subString(returnStr,1,length(returnStr)-1);            
    return returnStr;
    end if;
END //
DELIMITER ;

猜你喜欢

转载自blog.csdn.net/u012444184/article/details/92577594