Greenplum自定义递归函数
--删除自定义递归函数
DROP FUNCTION F_RECURSION_WAREHOUSE(ID TEXT[]);
--创建自定义递归函数
CREATE OR REPLACE FUNCTION F_RECURSION_WAREHOUSE(ID TEXT[])
RETURNS SETOF TWB_M_CK AS $BODY$
DECLARE
IDS TEXT[];
RD TWB_M_CK;
BEGIN
--判断参数ID是否为NULL
IF(ID IS NULL) THEN RETURN;END IF;
--ARRAY_AGG函数是用来连接到一个数组中的输入值,包括空。
SELECT ARRAY_AGG(PARENT_WAREHOUSE_ID) INTO IDS FROM TWB_M_CK WHERE WAREHOUSE_ID=ANY(ID::TEXT[]);
--遍历查询结果集
FOR RD IN (
SELECT * FROM TWB_M_CK WHERE WAREHOUSE_ID = ANY(ID::TEXT[])
UNION
SELECT * FROM F_RECURSION_WAREHOUSE(IDS)
)
LOOP RETURN NEXT RD; END LOOP;
END $BODY$
LANGUAGE 'PLPGSQL' VOLATILE;
--执行函数
SELECT T.WAREHOUSE_ID,T.PARENT_WAREHOUSE_ID,T.WAREHOUSE_LEVEL
FROM F_RECURSION_WAREHOUSE(CAST((SELECT ARRAY_AGG(WAREHOUSE_ID) FROM TWB_M_CK WHERE WAREHOUSE_TYPE = '2') AS TEXT[])) T
WHERE T.WAREHOUSE_TYPE = '1'
AND T.WAREHOUSE_LEVEL IS NOT NULL
AND T.WAREHOUSE_LEVEL NOT IN('4','14');
/*
* 备注:
* 1、自定义递归函数无法获取递归开始节点或递归路径;
* 2、递归结果集不支持关联查询;
*/
转载请注明原文地址: https://ju.6miu.com/read-718328.html