获取函数定义时出现“错误:“array_agg”是聚合函数”

Eri*_*984 7 postgresql aggregate-functions

我有以下查询来检索函数定义:

select pg_get_functiondef
from (
   select pp.proname, pl.lanname,pn.nspname, pg_get_functiondef(pp.oid) 
   from pg_proc pp
   inner join pg_namespace pn on (pp.pronamespace = pn.oid)
   inner join pg_language pl on (pp.prolang = pl.oid)
   where pl.lanname = 'plpgsql' and 
   pn.nspname = 'pga'
   ) f
where pg_get_functiondef like '%userid%'
Run Code Online (Sandbox Code Playgroud)

我只需要定义中包含特定文本的函数。

当我运行它时,抛出此错误:

"ERROR:  "array_agg" is an aggregate function"
Run Code Online (Sandbox Code Playgroud)

如果我只运行内部查询,它会按预期返回所有定义。没有错误。

我也尝试过这个 where 子句:

where pg_get_functiondef(pp.oid) like '%userid%'
Run Code Online (Sandbox Code Playgroud)

但也不起作用。怎么做?

Eri*_*son 5

pg_get_functiondef()不适用于聚合函数,并且pg_catalog.pg_proc包含许多聚合函数。您可以使用布尔值过滤掉它们pg_proc.proisagg,如下所示:

select
    proname as name,
    pronamespace::pg_catalog.regnamespace,
    pg_catalog.pg_get_functiondef(oid)
from pg_catalog.pg_proc
where proisagg is false; -- this filters them out
Run Code Online (Sandbox Code Playgroud)

  • 自 v11 起,`proisagg` 被替换为 `prokind`。我用 `prokind!= 'a'` (5认同)

Eri*_*984 3

答案如下:

SELECT n.nspname AS schema_name
     , p.proname AS function_name
     , pg_get_function_arguments(p.oid) AS args
     , pg_get_functiondef(p.oid) AS func_def
FROM  (SELECT oid, * FROM pg_proc p WHERE NOT p.proisagg) p
JOIN   pg_namespace n ON n.oid = p.pronamespace
WHERE  n.nspname LIKE 'pga%'
AND    pg_get_functiondef(p.oid) LIKE '%userid%';
Run Code Online (Sandbox Code Playgroud)

取自 dba.SE 上的相关答案并根据我的需要进行调整: