为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:
【操作系统】:
【CPU】:
【问题描述】*:
完整函数:
CREATE or REPLACE FUNCTION getParentOrgByUid(name varchar2(4000))
RETURN varchar2(4000)
AS
sPid varchar2(4000);
sPidTemp varchar2(4000);
pid varchar2(4000);
count int DEFAULT 0;
allpid varchar2(4000);
BEGIN
sPidTemp:= ‘’;
SELECT
GROUP_CONCAT(DISTINCT (CAST(id AS char))) INTO sPid
FROM “SYSDBA”.“organization”
WHERE id IN (SELECT
nodeid
FROM “SYSDBA”.“user”
WHERE username LIKE CONCAT(‘%’, name, ‘%’)
AND state = 1);
allpid:= ‘’;
WHILE (count = 0)
LOOP
IF (sPid IS NULL) THEN
allpid:= ‘-1’;
count:= 1;
ELSE
pid:= SUBSTRING_INDEX(sPid, ‘,’, 1);
sPidTemp: = CONCAT(sPidTemp, ‘,’, pid);
IF LENGTH(pid) = LENGTH(sPid) THEN
count:= 1;
sPid:= SUBSTRING(sPid FROM LENGTH(SUBSTRING_INDEX(sPid, ‘,’, 1)) FOR LENGTH(sPid) + 1);
ELSE
sPid:= SUBSTRING(sPid FROM LENGTH(SUBSTRING_INDEX(sPid, ‘,’, 1)) + 2 FOR LENGTH(sPid) + 1);
END IF;
SELECT
GROUP_CONCAT(CAST(id AS char)) INTO sPidTemp
FROM (SELECT
@r AS _id,
(SELECT
@r:= parentid
FROM “SYSDBA”.“organization”
WHERE id = _id) AS parent_id,
@l:= @l + 1 AS lvl
FROM (SELECT
@r:= pid,
@l:= ‘’) vars,
“SYSDBA”.“organization” h
WHERE @r<> ‘’) T1
JOIN “SYSDBA”.“organization” T2
ON T1._id = T2.id;
allpid:= CONCAT_WS(‘,’, pid, sPidTemp, allpid);
END IF;
END LOOP;
RETURN allpid;
END getParentOrgByUid;
mysql的语法真恶心,没有直接替代的修改方法,观察你这个语句的意思应该是要做一个递归查询,可以参考oracle中connect by 的递归用法。
connect by pid= [prior] parentid
@i=@i+1 可以改成level
https://blog.csdn.net/wang_yunj/article/details/51040029