Greenplum自定义递归函数

本文详细介绍了如何在Greenplum数据库环境下创建和使用自定义递归函数,通过实例展示了递归函数在解决复杂查询问题时的强大能力,帮助读者理解并掌握这一高级特性。
摘要由CSDN通过智能技术生成
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、递归结果集不支持关联查询;
 */


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值