如何用PostgreSQL递归查询获取函数的直接与间接依赖?
解决递归查询函数调用依赖的问题
你的SQL问题出在递归步骤中没有关联CTE表,导致proc_name参数无来源。以下是修正后的实现:
基础版(仅获取直接+间接调用的函数)
WITH RECURSIVE f (proc_name) AS ( -- 初始步骤:获取目标函数直接调用的所有函数 SELECT proc_name FROM oe.function_invoked(from => 'my_f') UNION ALL -- 递归步骤:用上一轮得到的函数作为参数,查询它们的调用依赖 SELECT fi.proc_name FROM f JOIN oe.function_invoked(from => f.proc_name) fi ON true ) -- 去重得到唯一的依赖函数列表(可根据需求去掉DISTINCT) SELECT DISTINCT proc_name FROM f;
进阶版(包含目标函数本身)
如果需要把原始函数my_f也纳入结果,可调整初始步骤:
WITH RECURSIVE f (proc_name) AS ( -- 先加入目标函数本身 SELECT 'my_f'::text AS proc_name UNION ALL -- 递归查询所有层级的调用依赖 SELECT fi.proc_name FROM f JOIN oe.function_invoked(from => f.proc_name) fi ON true ) SELECT DISTINCT proc_name FROM f;
关键修正点
- 递归步骤必须从CTE表
f中获取上一轮的函数名,作为oe.function_invoked的参数,否则数据库无法识别proc_name的来源。 - 使用
UNION ALL保证递归效率,若需要去重,可在最终查询加DISTINCT,或替换为UNION(但UNION会自动去重,效率略低)。 - 保留函数的命名参数
from =>,确保和你定义的oe.function_invoked函数参数匹配,避免参数绑定错误。
内容的提问来源于stack exchange,提问作者F__L
相关产品推荐
相关产品推荐

