I was bored and wrote an imitation MySQL replaceall() function

 

 

BEGIN


-- Used to control whether the loop ends
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 '';

-- Record the position where a symbol appeared in the last string
DECLARE VAR_LOG_SYMBOL_INDEX INTEGER(12) DEFAULT 0;

-- Record the string truncation start, end and character occurrence position
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;

-- Record the start, end and character occurrence position of string truncation after each update
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 the first position of the character in the string
SET VAR_STR_SYMBOL_INDEX = INSTR(SPLIT_STR, SPLIT_SYMBOL);

-- If the symbol exists in the string, traverse the data
IF VAR_STR_SYMBOL_INDEX <> 0 THEN

-- Initialize the first string interception position
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;

-- Loop operation
MYLOOP: LOOP

-- Loop end flag
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;
-- String intercepted each time
SELECT SUBSTR(SPLIT_STR , VAR_STR_INDEX_START, VAR_STR_INDEX_END) FROM DUAL INTO VAR_STR;

-- Generate a new string after each interception
SET VAR_STR_NEW = SUBSTR(SPLIT_STR, VAR_LOG_SYMBOL_INDEX + 1);
SET VAR_STR_NEW_SYMBOL_INDEX = INSTR(VAR_STR_NEW, SPLIT_SYMBOL);

-- Concatenate the string extracted each time
IF LENGTH(PARAM_OUT) <> 0 THEN
SET PARAM_OUT = CONCAT(PARAM_OUT, REPLACED_SYMBOL, VAR_STR);
END IF;

-- Concatenate the string extracted each time
IF LENGTH(PARAM_OUT) = 0 THEN
SET PARAM_OUT = CONCAT(PARAM_OUT, VAR_STR);
END IF;

--Initialization of the next string interception position
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
;

-- The last string is directly spliced ​​without interception and set to leave the loop flag
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, END_STR_INDEX_ VAR_LOG_SYMBOL_INDEX FROM DUAL;
SET DONE = 1;
END IF;

-- Set leave loop flag
IF VAR_STR_NEW_SYMBOL_INDEX = 0 AND LENGTH(VAR_STR_NEW) < 1 THEN
SET DONE = 1;
END IF;

-- close loop
END LOOP MYLOOP;

END IF;
RETURN PARAM_OUT;
END

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325259379&siteId=291194637