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)
我只需要定义中包含特定文本的函数。
当我运行它时,抛出此错误:
Run Code Online (Sandbox Code Playgroud)"ERROR: "array_agg" is an aggregate function"
如果我只运行内部查询,它会按预期返回所有定义。没有错误。
我也尝试过这个 where 子句:
where pg_get_functiondef(pp.oid) like '%userid%'
Run Code Online (Sandbox Code Playgroud)
但也不起作用。怎么做?
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)
答案如下:
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 上的相关答案并根据我的需要进行调整:
| 归档时间: |
|
| 查看次数: |
1741 次 |
| 最近记录: |