Greenplum自定义递归函数

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、递归结果集不支持关联查询;
 */


你可能感兴趣的:(Greenplum)