You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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;

关键修正点

  1. 递归步骤必须从CTE表f中获取上一轮的函数名,作为oe.function_invoked的参数,否则数据库无法识别proc_name的来源。
  2. 使用UNION ALL保证递归效率,若需要去重,可在最终查询加DISTINCT,或替换为UNION(但UNION会自动去重,效率略低)。
  3. 保留函数的命名参数from =>,确保和你定义的oe.function_invoked函数参数匹配,避免参数绑定错误。

内容的提问来源于stack exchange,提问作者F__L

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 16:50:11