列出在PostgreSQL中引用表的存储函数

76

一个快速而简单的问题:在PostgreSQL中,如何使用仅SELECT语句列出所有存储函数/存储过程的名称,如果可能的话,可以使用表?如果简单的SELECT不足够,我可以使用存储函数。

我想,我的问题与这个其他问题有点相似,但是这个其他问题是针对SQL Server 2005的:
List of Stored Procedure from Table

(可选)关于这一点,您如何以同样的方式列出使用相同表的触发器和约束条件?


1
使用表在PostgreSQL中列出存储函数 - klin
9个回答

101
SELECT  p.proname
FROM    pg_catalog.pg_namespace n
JOIN    pg_catalog.pg_proc p
ON      p.pronamespace = n.oid
WHERE   n.nspname = 'public';

1
正如Lukáš Lalinský在他的回答中指出的那样,PostgreSQL支持标准的information_schema.routines -- 对于所有喜欢标准事物的人都很有用。 - Piotr Findeisen

18
SELECT  proname, prosrc
FROM    pg_catalog.pg_namespace n
JOIN    pg_catalog.pg_proc p
ON      pronamespace = n.oid
WHERE   nspname = 'public';

3
下次可以考虑只编辑你自己帖子上面的内容,而不是去修改一个小细节。 - Daniel L. VanDenBosch
Daniel L. VanDenBosch:他几乎完全依靠这个答案的赞成票来积累他的声望,所以我不认为他会很快这样做。 - Lucio Mollinedo

16
如果你正在使用psql,可以尝试使用\df命令。
从man手册中得知:
Tip
To look up functions taking arguments or returning values of a specific type, use your pager's search capability to scroll through the \df output.

运行 \set ECHO_HIDDEN 将会显示 \df 在幕后运行的内容。


10

跟@quassnoi和@davidwhthomas一样,只不过我在那里添加了参数名称:

SELECT  proname, proargnames, prosrc 
FROM    pg_catalog.pg_namespace n
JOIN    pg_catalog.pg_proc p
ON      pronamespace = n.oid
WHERE   nspname = 'public';

如果列出函数的目的是为了清理它们或者迭代一个参数列表变化的新函数,那么您经常需要删除函数:

DROP FUNCTION <name>(<args>);
通过添加 proargnames,我能够构造出适用于删除的函数名称。 此外,在评估这些函数时,看到更完整的图片是很好的。

5
你可以使用标准的information_schema模式来获取关于你的数据库的元数据(它在SQL标准中,所以在不同的数据库系统中应该以相同的方式工作)。在这种情况下,你需要使用information_schema.routines

1
有用,但并没有真正回答问题。 - Jonathan Allen

4

排除系统相关内容:

select proname from pg_proc where proowner <> 1;

2
为什么不是1?在我的Postgresql安装中,系统过程的proowner是10,而不是1。 - bortzmeyer
我不知道。解决方案当然是相应地改变“1”。 - windyjonas

4

谢谢,这个可行。再加上SELECT pg_catalog.pg_get_functiondef('functionName'::regproc),你也可以得到创建语句。 - Wulfhart
提取META...链接是对我有效的,直到现在我才看到“recipe”链接。 - Wulfhart
1
第二个链接已经失效了。 :-( 请将第一个链接的内容合并到这个答案中,这样当第一个链接失效时我们就不会一无所知了。谢谢。 - Toby Speight

1
请更改以下查询中的 schema_name 和 table_name:
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   pg_proc p
JOIN   pg_namespace n ON n.oid = p.pronamespace
AND    n.nspname = 'schema_name'
AND    p.prosrc like '%table_name%'

由于表名区分大小写,因此需要定义精确的表名。


1
请注意,PostgreSQL确实具有ILIKE关键字和~~*运算符,两者都可用于不区分大小写的匹配。 - mkopriva

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接