只是一个简单快速的问题:在PostgreSQL中,如果可能的话,如何仅使用SELECT语句使用表列出所有存储函数/存储过程的名称?如果简单的SELECT不足,我可以使用存储的函数。
我的问题与该其他问题有点类似,但是该其他问题是针对SQL Server 2005:
表中存储过程的列表
(可选)为此,您还如何列出以相同方式使用同一表的触发器和约束?
Answers:
SELECT p.proname
FROM pg_catalog.pg_namespace n
JOIN pg_catalog.pg_proc p
ON p.pronamespace = n.oid
WHERE n.nspname = 'public';
information_schema.routines
-对所有喜欢标准的东西都有用。
SELECT proname, prosrc
FROM pg_catalog.pg_namespace n
JOIN pg_catalog.pg_proc p
ON pronamespace = n.oid
WHERE nspname = 'public';
与@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构建适用的函数名。
此外,很高兴在评估功能时看到更完整的图片。
您可以使用标准information_schema
架构来获取有关数据库的元数据(它属于SQL标准,因此在不同的数据库系统中应以相同的方式工作)。在这种情况下,您想要information_schema.routines
。
排除系统内容:
select proname from pg_proc where proowner <> 1;
看我的食谱。它读取函数和触发器。它基于以下信息:从PostgreSQL提取META信息(INFORMATION_SCHEMA)
为了检索函数的参数类型,这是在ALTER中引用该函数所必需的-使用oldevectortypes对我来说效果很好。
请在以下查询中更改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%'
由于表名区分大小写,因此需要定义确切的表名。