我如何获得PostgreSQL中存储在特定模式的数据库中的所有函数的列表?
我希望能够连接到PostgreSQL数据库并查找特定模式的所有function。
我的想法是,我可以对pg_catalog或information_schema进行一些查询,并获得所有函数的列表,但我不知道名称和参数的存储位置。 我正在寻找一个查询,会给我的函数名称和参数types(以及他们采取什么样的顺序)。
有没有办法做到这一点?
\df <schema>.*
在psql
给出了必要的信息。
要查看内部使用psql
连接到数据库的查询并提供额外的“ -E
”(或“ --echo-hidden
”)选项,然后执行上述命令。
经过一番search,我能够findinformation_schema.routines
表和information_schema.parameters
表。 使用这些,可以为此构build一个查询。 左连接,而不是连接,是必要的检索function没有参数。
SELECT routines.routine_name, parameters.data_type, parameters.ordinal_position FROM information_schema.routines LEFT JOIN information_schema.parameters ON routines.specific_name=parameters.specific_name WHERE routines.specific_schema='my_specified_schema_name' ORDER BY routines.routine_name, parameters.ordinal_position;
如果有人对这里感兴趣的话,在postgres 9.1上通过psql
执行什么查询:
SELECT n.nspname as "Schema", p.proname as "Name", pg_catalog.pg_get_function_result(p.oid) as "Result data type", pg_catalog.pg_get_function_arguments(p.oid) as "Argument data types", CASE WHEN p.proisagg THEN 'agg' WHEN p.proiswindow THEN 'window' WHEN p.prorettype = 'pg_catalog.trigger'::pg_catalog.regtype THEN 'trigger' ELSE 'normal' END as "Type" FROM pg_catalog.pg_proc p LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace WHERE pg_catalog.pg_function_is_visible(p.oid) AND n.nspname <> 'pg_catalog' AND n.nspname <> 'information_schema' ORDER BY 1, 2, 4;
你可以通过运行带-E
标志的psql
来得到psql
为反斜杠命令运行的内容。
有一个方便的函数, oidvectortypes
,这使得这更容易。
SELECT format('%I.%I(%s)', ns.nspname, p.proname, oidvectortypes(p.proargtypes)) FROM pg_proc p INNER JOIN pg_namespace ns ON (p.pronamespace = ns.oid) WHERE ns.nspname = 'my_namespace';
oidvectortypes
Postgres Online的Leo Hsu和Regina oidvectortypes
指出oidvectortypes
。 我以前写过类似的函数,但是使用了复杂的嵌套expression式,这个函数可以摆脱这个需要。
看到相关的答案 。
(在2016年编辑)
总结典型的报告选项:
-- Compact: SELECT format('%I.%I(%s)', ns.nspname, p.proname, oidvectortypes(p.proargtypes)) -- With result data type: SELECT format( '%I.%I(%s)=%s', ns.nspname, p.proname, oidvectortypes(p.proargtypes), pg_get_function_result(p.oid) ) -- With complete argument description: SELECT format('%I.%I(%s)', ns.nspname, p.proname, pg_get_function_arguments(p.oid)) -- ... and mixing it. -- All with the same FROM clause: FROM pg_proc p INNER JOIN pg_namespace ns ON (p.pronamespace = ns.oid) WHERE ns.nspname = 'my_namespace';
注意 :使用p.proname||'_'||p.oid AS specific_name
来获得唯一的名称,或者使用information_schema
表来join – 参见@ RuddZwolinski答案的routines
和parameters
。
函数的OID (请参阅pg_catalog.pg_proc
)和函数的specific_name (请参阅information_schema.routines
)是函数的主要参考选项。 以下是报告和其他环境中的一些有用的function。
--- --- --- --- --- --- Useful overloads: CREATE FUNCTION oidvectortypes(p_oid int) RETURNS text AS $$ SELECT oidvectortypes(proargtypes) FROM pg_proc WHERE oid=$1; $$ LANGUAGE SQL IMMUTABLE; CREATE FUNCTION oidvectortypes(p_specific_name text) RETURNS text AS $$ -- Extract OID from specific_name and use it in oidvectortypes(oid). SELECT oidvectortypes(proargtypes) FROM pg_proc WHERE oid=regexp_replace($1, '^.+?([^_]+)$', '\1')::int; $$ LANGUAGE SQL IMMUTABLE; CREATE FUNCTION pg_get_function_arguments(p_specific_name text) RETURNS text AS $$ -- Extract OID from specific_name and use it in pg_get_function_arguments. SELECT pg_get_function_arguments(regexp_replace($1, '^.+?([^_]+)$', '\1')::int) $$ LANGUAGE SQL IMMUTABLE; --- --- --- --- --- --- User customization: CREATE FUNCTION pg_get_function_arguments2(p_specific_name text) RETURNS text AS $$ -- Example of "special layout" version. SELECT trim(array_agg( op||'-'||dt )::text,'{}') FROM ( SELECT data_type::text as dt, ordinal_position as op FROM information_schema.parameters WHERE specific_name = p_specific_name ORDER BY ordinal_position ) t $$ LANGUAGE SQL IMMUTABLE;
在SQL查询下面运行以创build一个显示所有函数的视图:
CREATE OR REPLACE VIEW show_functions AS SELECT routine_name FROM information_schema.routines WHERE routine_type='FUNCTION' AND specific_schema='public';
是一个好主意,用第一个字来命名带有通信别名的函数,用LIKE
名称来填充Postgresql 9.4中的公共模式的例子,一定要用他的schemereplace
SELECT routine_name FROM information_schema.routines WHERE routine_type='FUNCTION' AND specific_schema='public' AND routine_name LIKE 'aliasmyfunctions%';
例:
perfdb-# \df information_schema.*; List of functions Schema | Name | Result data type | Argument data types | Type information_schema | _pg_char_max_length | integer | typid oid, typmod integer | normal information_schema | _pg_char_octet_length | integer | typid oid, typmod integer | normal information_schema | _pg_datetime_precision| integer | typid oid, typmod integer | normal ..... information_schema | _pg_numeric_scale | integer | typid oid, typmod integer | normal information_schema | _pg_truetypid | oid | pg_attribute, pg_type | normal information_schema | _pg_truetypmod | integer | pg_attribute, pg_type | normal (11 rows)