一个快速而简单的问题:在PostgreSQL中,如何使用仅SELECT语句列出所有存储函数/存储过程的名称,如果可能的话,可以使用表?如果简单的SELECT不足够,我可以使用存储函数。
我想,我的问题与这个其他问题有点相似,但是这个其他问题是针对SQL Server 2005的:
List of Stored Procedure from Table
(可选)关于这一点,您如何以同样的方式列出使用相同表的触发器和约束条件?
一个快速而简单的问题:在PostgreSQL中,如何使用仅SELECT语句列出所有存储函数/存储过程的名称,如果可能的话,可以使用表?如果简单的SELECT不足够,我可以使用存储函数。
我想,我的问题与这个其他问题有点相似,但是这个其他问题是针对SQL Server 2005的:
List of Stored Procedure from Table
(可选)关于这一点,您如何以同样的方式列出使用相同表的触发器和约束条件?
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
-- 对于所有喜欢标准事物的人都很有用。 - Piotr FindeisenSELECT proname, prosrc
FROM pg_catalog.pg_namespace n
JOIN pg_catalog.pg_proc p
ON pronamespace = n.oid
WHERE nspname = 'public';
\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
在幕后运行的内容。
跟@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,我能够构造出适用于删除的函数名称。
此外,在评估这些函数时,看到更完整的图片是很好的。information_schema
模式来获取关于你的数据库的元数据(它在SQL标准中,所以在不同的数据库系统中应该以相同的方式工作)。在这种情况下,你需要使用information_schema.routines
。排除系统相关内容:
select proname from pg_proc where proowner <> 1;
请看我的技巧分享,其中介绍了函数和触发器。这些信息来源于从PostgreSQL(INFORMATION_SCHEMA)中提取META信息
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%'
由于表名区分大小写,因此需要定义精确的表名。
ILIKE
关键字和~~*
运算符,两者都可用于不区分大小写的匹配。 - mkopriva为了检索函数的参数类型,在引用函数时需要这些类型,使用oldevectortypes对我来说效果很好。