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


72

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

我的问题与该其他问题有点类似,但是该其他问题是针对SQL Server 2005:
表中存储过程的列表

(可选)为此,您还如何列出以相同方式使用同一表的触发器和约束?


Answers:


98
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 2014年

17
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

14

如果您使用的是psql,请尝试 \df

从手册页:

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,我可以为drop构建适用的函数名。

此外,很高兴在评估功能时看到更完整的图片。



4

排除系统内容:

select proname from pg_proc where proowner <> 1;

2
为什么<> 1?在我的Postgresql安装中,系统过程的所有者是10,而不是
1。– bortzmeyer

我不知道 解决方案当然是相应地更改“ 1”。
windyjonas

4

看我的食谱。它读取函数和触发器。它基于以下信息:从PostgreSQL提取META信息(INFORMATION_SCHEMA)


谢谢,这工作。与SELECT pg_catalog.pg_get_functiondef('functionName':: regproc)结合使用,您也可以获取create语句。
Wulfhart 2012年

提取META ...链接对我有用,直到现在我还没有看到“食谱”链接。
Wulfhart 2012年

1
第二个链接已死。:-(请结合第一链接的内容到这个答案所以我们不会在黑暗中离开时,一个模具感谢。
托比斯佩特


0

请在以下查询中更改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%'

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.