只是一个简单快速的问题:在PostgreSQL中,如果可能的话,如何使用只使用SELECT语句的表列出所有存储函数/存储过程的名称?如果一个简单的SELECT不足,我可以使用存储的函数。
我认为,我的问题与其他问题有些类似,但另一个问题是针对SQL Server 2005:
List of Stored Procedure from Table
(可选)就此而言,您如何以相同的方式列出使用同一个表的触发器和约束?
答案 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%'
由于表名区分大小写,因此需要定义确切的表名。