delimiter $$ CREATE FUNCTION `getChildidList`(rootId varchar(38)) RETURNS text DETERMINISTIC BEGIN DECLARE sTemp text; DECLARE sTempChd text; SET@@group_concat_max_len = 102400; SET sTemp = '$'; SET sTempChd = rootId; WHILE sTempChd IS NOT NULL DO SET sTemp = concat(sTemp, ',', sTempChd); SELECT group_concat(ORGA001) INTO sTempChd FROM hrsw_t_organ WHERE FIND_IN_SET(ORGA002, sTempChd) > 0; END WHILE; SET@@group_concat_max_len = 1024; RETURN SUBSTRING(sTemp,3); END; $$ 使用Oracle重写,Oracle版本为12c
时间: 2024-02-15 07:27:56 浏览: 87
mysql存储过程之创建(CREATE PROCEDURE)和调用(CALL)及变量创建(DECLARE)和赋值(SET)操作方法
5星 · 资源好评率100%
对于这个MySQL函数,可以使用以下语句在Oracle 12c中进行重写:
CREATE OR REPLACE FUNCTION getChildidList(rootId VARCHAR2)
RETURN VARCHAR2
DETERMINISTIC
IS
sTemp VARCHAR2(32767);
sTempChd VARCHAR2(32767);
BEGIN
sTemp := '$';
sTempChd := rootId;
WHILE sTempChd IS NOT NULL LOOP
sTemp := sTemp || ',' || sTempChd;
SELECT LISTAGG(ORGA001, ',') WITHIN GROUP (ORDER BY ORGA001) INTO sTempChd
FROM hrsw_t_organ
WHERE REGEXP_LIKE(sTempChd, '(^|,)'|| ORGA002 ||'(,|$)');
END LOOP;
RETURN SUBSTR(sTemp, 3);
END;
/
需要注意的是,Oracle没有像MySQL一样的group_concat函数,可以使用LISTAGG函数来代替。同时,Oracle中没有FIND_IN_SET函数,可以使用正则表达式来实现类似的功能。在上面的代码中,使用REGEXP_LIKE函数来判断sTempChd是否包含ORGA002。
阅读全文