MySQL 5.7:实现多列表循环存入表格的存储过程改造
改造MySQL存储过程以支持多组逗号分隔列表输入并输出多列表格
原存储过程的问题说明
原存储过程存在语法错误且未实现实际数据输出逻辑:
CHAR_LENGHT拼写错误,应为CHAR_LENGTHSET ListName = _value语句末尾缺失分号- 仅循环处理变量,未将结果输出或写入表中
改造后的存储过程
以下是支持多组列表输入、输出多列多行结果的存储过程代码:
CREATE DEFINER = 'root' PROCEDURE List_values_to_table(_groups TEXT) BEGIN -- 声明变量 DECLARE _group TEXT DEFAULT NULL; DECLARE _group_len INT DEFAULT NULL; DECLARE _current_group TEXT DEFAULT NULL; -- 创建临时表存储结果 DROP TEMPORARY TABLE IF EXISTS temp_result; CREATE TEMPORARY TABLE temp_result ( col VARCHAR(64), col1 VARCHAR(64), col2 VARCHAR(64) ); -- 清理输入字符串首尾冗余符号 SET _groups = TRIM(BOTH '() ' FROM _groups); -- 循环拆分每个组 group_iterator: LOOP IF CHAR_LENGTH(TRIM(_groups)) = 0 OR _groups IS NULL THEN LEAVE group_iterator; END IF; -- 提取第一个组 SET _group = SUBSTRING_INDEX(_groups, '),', 1); SET _group_len = CHAR_LENGTH(_group) + 2; SET _current_group = TRIM(BOTH '() ' FROM CONCAT('(', _group, ')')); -- 拆分当前组的逗号分隔值并插入临时表 INSERT INTO temp_result (col, col1, col2) SELECT TRIM(SUBSTRING_INDEX(_current_group, ',', 1)) AS col, TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(_current_group, ',', 2), ',', -1)) AS col1, TRIM(SUBSTRING_INDEX(_current_group, ',', -1)) AS col2; -- 移除已处理的组 SET _groups = INSERT(_groups, 1, _group_len, ''); END LOOP group_iterator; -- 输出最终结果 SELECT * FROM temp_result; -- 清理临时表 DROP TEMPORARY TABLE IF EXISTS temp_result; END
调用示例
传入多组列表时,需将所有组包裹为单个字符串参数:
CALL List_values_to_table('(Test,Test1,Test2),(Emp,Emp1,Emp2)');
输出结果
col col1 col2 ----- ------ ------ Test Test1 Test2 Emp Emp1 Emp2
逻辑说明
- 用临时表存储中间结果,确保输出格式符合要求
- 以
),为分隔符拆分输入字符串中的每个组 - 对每个组拆分逗号分隔的三个值,分别映射到
col/col1/col2列 - 统一查询临时表输出结果,最后自动清理临时表
内容的提问来源于stack exchange,提问作者manasasai
相关产品推荐
相关产品推荐

