中易网

mysql 创建存储过程中用到循环,怎么通过select返回结果集

答案:1  悬赏:0  
解决时间 2021-03-08 03:52
运行的时候只能,返回一个条信息(此函数是分隔字符串的函数) 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; 想要的是
最佳答案
测试表与测试数据
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)
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
中国人民银行ATM在哪里啊,我有事要去这个
k1156的6车12.13号是靠窗还是靠走廊的昂
不思议迷宫魔法傀儡冈布奥怎么选择
弟弟结婚,姐姐应该给随礼多少钱
扎鲁特旗教体局直属幼儿园地址在什么地方,想
鱼刺卡喉一个多月,做了很多检查,喉镜,胃镜,
WORD 如何设置3级标题? 例:3 3.1 1.1.1(应
林书豪的转会火箭的转会费费是多少?林书豪的
孤岛危机3的配置多少钱
大美旅游欢乐假期国旅(经十路店)在什么地方啊
承德避暑山庄月色江声门上的对联
发财树全用营养土 椰土 有机肥怎么样
求大佬推荐张稳定40帧的吃鸡卡。
魔法天女适合儿童看吗?对她们形成正确的人生
草科村活动室地址在哪,我要去那里办事
推荐资讯
宣王说之说是什么意思
转正和不转正有何区别?谢谢!
住酒店凌晨几点算第二天的?
名禾地板是什么时候开始在央视做广告的,这么
各位体育高手,请问女子400m成绩一般是几秒啊
昆明香江大酒店怎么样?
到一个陌生城市买房子应该注意什么?
谁能帮我弄个藏头诗一个是:张雪迎我爱你 不
吃医用石蜡油要喝水吗
我一点开192.168.1.1就是这样。。输账户密码a
万年老大是谁?
iphone4 运营商设置更新 ICCID不显示
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?