zoukankan      html  css  js  c++  java
  • 闲的无聊写了个仿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

  • 相关阅读:
    页面转表格并且下载
    关于表格导入
    C/C++作用域运算符::
    设计模式之观察者模式_C++
    C# 传不定参数
    C语言中的位域的使用
    C++/python求哈希值(SHA256)
    C++中纯虚函数
    类模板/函数模板实现父类指针指向子类对象(虚函数实现多态)
    Windows Socket 接口简介
  • 原文地址:https://www.cnblogs.com/Dream-Lasting/p/8991930.html
Copyright © 2011-2022 走看看