“ERROR:”array_agg“是​​一个聚合函数”,同时获取函数定义

时间:2018-02-09 15:57:13

标签: 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%'

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

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

"ERROR:  "array_agg" is an aggregate function"

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

我也试过这个子句:

where pg_get_functiondef(pp.oid) like '%userid%'

但也不起作用。怎么做?

2 个答案:

答案 0 :(得分:2)

以下是答案:

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%';

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

答案 1 :(得分:1)

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