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

时间:2009-10-13 08:54:55

标签: sql postgresql metaprogramming

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

我认为,我的问题与其他问题有些类似,但另一个问题是针对SQL Server 2005:
List of Stored Procedure from Table

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

9 个答案:

答案 0 :(得分:94)

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 :(得分:16)

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

答案 2 :(得分:13)

如果您使用的是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

答案 3 :(得分:9)

与@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';

如果列出函数的目的是清理它们或者使用更改的params列表迭代一个新函数,那么你经常需要删除函数:

DROP FUNCTION <name>(<args>);

通过添加proargnames,我可以构建drop的适用函数名。

此外,在评估功能时,可以看到更全面的图片。

答案 4 :(得分:5)

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

答案 5 :(得分:4)

排除系统内容:

select proname from pg_proc where proowner <> 1;

答案 6 :(得分:4)

看看我的recipe。它读取函数和触发器。它基于来自Extracting META information from PostgreSQL (INFORMATION_SCHEMA)

的信息

答案 7 :(得分:0)

用于检索函数的参数类型,这些函数在 ALTER 中引用函数时是必需的 - 使用 oldevectortypes 对我来说效果很好。

请参阅How can I get a list of all functions stored in the database of a particular schema in PostgreSQL?

答案 8 :(得分: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%'

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