mysql 创建存储过程中用到循环,怎么通过select返回结果集
答案:1 悬赏:0
解决时间 2021-03-08 03:52
- 提问者网友:生亦何欢
- 2021-03-07 05:09
运行的时候只能,返回一个条信息(此函数是分隔字符串的函数)
CREATE procedure ceshi(in Str varchar(2048),in SplitChar varchar(50))
begin
declare ind int;
declare unit varchar(128);
declare inext int;
declare len int;
declare i int;
set ind=1;
set i=1;
set len=length(Str);
while ind<=len do
begin
set inext=instr(Str,SplitChar);
if inext=0 then set inext=len+1; end if;
if inext>ind then
begin
set unit=ltrim(rtrim(substring(Str,1,inext-1)));
if unit<>'' then
begin
select unit as Value,i as vindex; //这里的select每循环一次,值就不一样,我想让他作为结果集返 //回应该怎么做
set Str=substring(Str,inext+1);
set i=i+1;
select Str,ind,inext,len,unit;
end;
end if;
end;
end if;
end;
set ind=inext+1;
end while;
end;
想要的是
最佳答案
- 二级知识专家网友:陪衬角色
- 2021-03-07 06:42
测试表与测试数据
CREATE TABLE TestMulToOne (
name VARCHAr(10),
allTitles VARCHAr(200)
);
INSERT INTO TestMulToOne VALUES ('张三', '程序员,系统管理员,网络管理员');
INSERT INTO TestMulToOne VALUES ('李四', '项目经理,系统分析员');
DELIMITER //
DROp FUNCTION GetTextCount //
CREATE FUNCTION GetTextCount(pSourceText VARCHAr(255), pDivChar CHAr(1))
RETURNS TINYINT
BEGIN
-- 预期结果.
DECLARE vResult TINYINT;
-- 当前逗号的位置.
DECLARE vIndex INT;
-- 前一个逗号的位置.
DECLARE vPrevIndex INT;
-- 结果的初始值.
SET vResult = 1;
-- 查询第一个 逗号的位置.
SET vIndex = INSTR(pSourceText, pDivChar);
IF vIndex = 0 THEN
-- 参数中没有逗号,直接返回.
RETURN vResult;
END IF;
-- 初始化情况,前一个逗号不存在.
SET vPrevIndex = 0;
-- 循环处理。
WHILE vIndex > 0 DO
-- 结果递增.
SET vResult = vResult + 1;
-- 前一个逗号的位置 = 当前逗号的位置
SET vPrevIndex = vIndex;
-- 查询下一个逗号的位置.
SET vIndex = LOCATE(pDivChar, pSourceText, vPrevIndex + 1);
END WHILE;
-- 返回结果.
RETURN vResult;
END;
//
DROP FUNCTION GetTextValue //
CREATE FUNCTION GetTextValue(pSourceText VARCHAr(255), pDivChar CHAr(1), pIndex TINYINT)
RETURNS VARCHAr(255)
BEGIN
-- 预期结果.
DECLARE vResult VARCHAr(255);
IF pIndex = 1 THEN
SELECT SUBSTRING_INDEX(pSourceText, pDivChar, 1) INTO vResult;
ELSE
SELECT
REPLACE(
SUBSTRING_INDEX(pSourceText, pDivChar, pIndex),
CONCAt(SUBSTRING_INDEX(pSourceText, pDivChar, pIndex - 1) , pDivChar),
'') INTO vResult;
END IF;
-- 返回.
RETURN vResult;
END;
//
DELIMITER ;
SELECT
t.name,
GetTextValue(t.allTitles, ',', MaxNum.No) AS OneTitle
FROM
TestMulToOne t,
(SELECT 1 No UNIOn ALL
SELECT 2 No UNIOn ALL
SELECT 3 No UNIOn ALL
SELECT 4 No UNIOn ALL
SELECT 5 No ) MaxNum
WHERe
GetTextCount(t.allTitles, ',') >= MaxNum.No
ORDER BY
t.name;
+------+------------+
| name | OneTitle |
+------+------------+
| 张三 | 系统管理员 |
| 张三 | 网络管理员 |
| 张三 | 程序员 |
| 李四 | 系统分析员 |
| 李四 | 项目经理 |
+------+------------+
5 rows in set (0.00 sec)
CREATE TABLE TestMulToOne (
name VARCHAr(10),
allTitles VARCHAr(200)
);
INSERT INTO TestMulToOne VALUES ('张三', '程序员,系统管理员,网络管理员');
INSERT INTO TestMulToOne VALUES ('李四', '项目经理,系统分析员');
DELIMITER //
DROp FUNCTION GetTextCount //
CREATE FUNCTION GetTextCount(pSourceText VARCHAr(255), pDivChar CHAr(1))
RETURNS TINYINT
BEGIN
-- 预期结果.
DECLARE vResult TINYINT;
-- 当前逗号的位置.
DECLARE vIndex INT;
-- 前一个逗号的位置.
DECLARE vPrevIndex INT;
-- 结果的初始值.
SET vResult = 1;
-- 查询第一个 逗号的位置.
SET vIndex = INSTR(pSourceText, pDivChar);
IF vIndex = 0 THEN
-- 参数中没有逗号,直接返回.
RETURN vResult;
END IF;
-- 初始化情况,前一个逗号不存在.
SET vPrevIndex = 0;
-- 循环处理。
WHILE vIndex > 0 DO
-- 结果递增.
SET vResult = vResult + 1;
-- 前一个逗号的位置 = 当前逗号的位置
SET vPrevIndex = vIndex;
-- 查询下一个逗号的位置.
SET vIndex = LOCATE(pDivChar, pSourceText, vPrevIndex + 1);
END WHILE;
-- 返回结果.
RETURN vResult;
END;
//
DROP FUNCTION GetTextValue //
CREATE FUNCTION GetTextValue(pSourceText VARCHAr(255), pDivChar CHAr(1), pIndex TINYINT)
RETURNS VARCHAr(255)
BEGIN
-- 预期结果.
DECLARE vResult VARCHAr(255);
IF pIndex = 1 THEN
SELECT SUBSTRING_INDEX(pSourceText, pDivChar, 1) INTO vResult;
ELSE
SELECT
REPLACE(
SUBSTRING_INDEX(pSourceText, pDivChar, pIndex),
CONCAt(SUBSTRING_INDEX(pSourceText, pDivChar, pIndex - 1) , pDivChar),
'') INTO vResult;
END IF;
-- 返回.
RETURN vResult;
END;
//
DELIMITER ;
SELECT
t.name,
GetTextValue(t.allTitles, ',', MaxNum.No) AS OneTitle
FROM
TestMulToOne t,
(SELECT 1 No UNIOn ALL
SELECT 2 No UNIOn ALL
SELECT 3 No UNIOn ALL
SELECT 4 No UNIOn ALL
SELECT 5 No ) MaxNum
WHERe
GetTextCount(t.allTitles, ',') >= MaxNum.No
ORDER BY
t.name;
+------+------------+
| name | OneTitle |
+------+------------+
| 张三 | 系统管理员 |
| 张三 | 网络管理员 |
| 张三 | 程序员 |
| 李四 | 系统分析员 |
| 李四 | 项目经理 |
+------+------------+
5 rows in set (0.00 sec)
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯