CREATE DEFINER=`aaa`@`%` FUNCTION `queryChildAllParentInfo`(chldMember_Id VARCHAR(32)) RETURNS longtext CHARSET utf8
DETERMINISTIC
BEGIN
/*
@author:shitianaaa
@date:20190810
@descrition:
该函数传入一个用户member_id ,递归它所有的上级,直到根节点,然后把所有的父级member_id 做为一个列表(逗号分隔)的方式返回
函数调用方式:select mddb.queryChildAllParentInfo('8851f660fc5611e8a69cb5a96a9953ea') from dual;
调用该函数返回以'8851f660fc5611e8a69cb5a96a9953ea' 为起始的所有父级节点
*/
DECLARE sTemp LONGTEXT;
DECLARE sTempChd VARCHAR(32);
SET sTemp='$';
SET sTempChd = CAST(chldMember_Id AS CHAR);
SET sTemp = CONCAT(sTemp,',',sTempChd);
set sTempChd := (select parent_id FROM md_member_distribution WHERE member_id = sTempChd);
WHILE (sTempChd is not null || sTempChd !='') DO
IF (sTempChd is not null || sTempChd !='') THEN
SET sTemp = CONCAT(sTemp,',',ifnull(sTempChd,''));
END IF;
-- SELECT parent_id INTO sTempChd FROM md_member_distribution WHERE member_id = sTempChd;
set sTempChd := (select parent_id FROM md_member_distribution WHERE member_id = sTempChd);
END WHILE;
RETURN sTemp;
END
其中SELECT parent_id INTO sTempChd FROM md_member_distribution WHERE member_id = sTempChd; 如果parent_id 为空,则
sTempChd 值是不会改变的,导致,while 陷入死循环,这种原因官网解释如下:对于循环作为退出条件而言,使用select into要小心
最好使用
set sTempChd := (select parent_id FROM md_member_distribution WHERE member_id = sTempChd);
select ... into @var 语句中,如果查询返回记录是空,那么变量将不会被改变。
官网文档表述:
The selected values are assigned to the variables. The number of variables must match the number of columns. The query should return a single row. If the query returns no rows, a warning with error code 1329 occurs (No data), and the variable values remain unchanged.
PS:mysql存储过程中 声明decimal,不能使用大写,如果使用DECIMAL(10,2) 会报错 DECLARE bounesAmt25 decimal(10,2) DEFAULT 25.00;
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!