闲的无聊写了个仿MySQL replaceall() 函数

 

 

BEGIN


-- 用于控制循环是否结束
DECLARE DONE INT DEFAULT -1;

-- 变量声明
DECLARE PARAM_OUT VARCHAR(512) DEFAULT '';
DECLARE VAR_STR VARCHAR(512) DEFAULT '';
DECLARE VAR_STR_NEW VARCHAR(512) DEFAULT '';
DECLARE VAR_SPLIT_STR VARCHAR(512) DEFAULT '';
DECLARE VAR_SPLIT_SYMBOL VARCHAR(512) DEFAULT '';

-- 记录上次字符串中某符号出现的位置
DECLARE VAR_LOG_SYMBOL_INDEX INTEGER(12) DEFAULT 0;

-- 记录字符串截取开始、结束和字符出现的位置
DECLARE VAR_STR_INDEX_START INTEGER(12) DEFAULT 0;
DECLARE VAR_STR_INDEX_END INTEGER(12) DEFAULT 0;
DECLARE VAR_STR_SYMBOL_INDEX INTEGER(12) DEFAULT 0;

-- 记录每次更新后字符串截取开始、结束和字符出现的位置
DECLARE VAR_STR_NEW_INDEX_START INTEGER(12) DEFAULT 0;
DECLARE VAR_STR_NEW_INDEX_END INTEGER(12) DEFAULT 0;
DECLARE VAR_STR_NEW_SYMBOL_INDEX INTEGER(12) DEFAULT 0;

-- 设置字符出现在字符串中的首次位置
SET VAR_STR_SYMBOL_INDEX = INSTR(SPLIT_STR, SPLIT_SYMBOL);

-- 字符串存在该符号 则遍历数据
IF VAR_STR_SYMBOL_INDEX <> 0 THEN

-- 首次字符串截取位置初始化
SET PARAM_OUT = '';
SET VAR_STR_INDEX_START = 1;
SET VAR_STR_INDEX_END = VAR_STR_SYMBOL_INDEX - 1;
SET VAR_LOG_SYMBOL_INDEX = VAR_STR_SYMBOL_INDEX;

-- 循环操作
MYLOOP: LOOP

-- 循环结束标志
IF DONE = 1 THEN LEAVE MYLOOP; END IF;

-- SELECT VAR_STR_NEW, VAR_STR_NEW_SYMBOL_INDEX, VAR_STR_INDEX_START, VAR_STR_INDEX_END, VAR_LOG_SYMBOL_INDEX FROM DUAL;
-- 每次截取的字符串
SELECT SUBSTR(SPLIT_STR, VAR_STR_INDEX_START, VAR_STR_INDEX_END) FROM DUAL INTO VAR_STR;

-- 每次截取字符串后产生新的字符串
SET VAR_STR_NEW = SUBSTR(SPLIT_STR, VAR_LOG_SYMBOL_INDEX + 1);
SET VAR_STR_NEW_SYMBOL_INDEX = INSTR(VAR_STR_NEW, SPLIT_SYMBOL);

-- 拼接每次截取出来的字符串
IF LENGTH(PARAM_OUT) <> 0 THEN
SET PARAM_OUT = CONCAT(PARAM_OUT, REPLACED_SYMBOL, VAR_STR);
END IF;

-- 拼接每次截取出来的字符串
IF LENGTH(PARAM_OUT) = 0 THEN
SET PARAM_OUT = CONCAT(PARAM_OUT, VAR_STR);
END IF;

-- 下一次字符串截取位置的初始化
IF VAR_STR_NEW_SYMBOL_INDEX <> 0 THEN
SET VAR_STR_INDEX_START = VAR_LOG_SYMBOL_INDEX + 1;
SET VAR_LOG_SYMBOL_INDEX = VAR_LOG_SYMBOL_INDEX + VAR_STR_NEW_SYMBOL_INDEX;
SET VAR_STR_INDEX_END = VAR_STR_NEW_SYMBOL_INDEX - 1;
END IF;

-- 最后一次字符串不截取直接拼接并设置离开循环标志
IF VAR_STR_NEW_SYMBOL_INDEX = 0 AND LENGTH(VAR_STR_NEW) > 0 THEN
SET PARAM_OUT = CONCAT(PARAM_OUT, REPLACED_SYMBOL, VAR_STR_NEW);
-- SELECT VAR_STR_NEW, VAR_STR_NEW_SYMBOL_INDEX, VAR_STR_INDEX_START, VAR_STR_INDEX_END, VAR_LOG_SYMBOL_INDEX FROM DUAL;
SET DONE = 1;
END IF;

-- 设置离开循环标志
IF VAR_STR_NEW_SYMBOL_INDEX = 0 AND LENGTH(VAR_STR_NEW) < 1 THEN
SET DONE = 1;
END IF;

-- 关闭循环
END LOOP MYLOOP;

END IF;
RETURN PARAM_OUT;
END

转载于:https://www.cnblogs.com/Dream-Lasting/p/8991930.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值