Как я могу получить список всех функций, хранящихся в базе данных конкретной схемы в PostgreSQL?
Я хочу иметь возможность подключиться к базе данных PostgreSQL и найти все функции для конкретной схемы.
Я думал, что я мог бы сделать некоторый запрос к pg_catalog или information_schema и получить список всех функций, но я не могу понять, где хранятся имена и параметры. Я ищу запрос, который даст мне имя функции и типы параметров, которые он принимает (и в каком порядке он их принимает).
есть ли способ сделать это?
7 ответов:
\df <schema>.*на
psqlдает необходимую информацию.посмотреть запрос, который используется внутренне подключиться к базе данных с
psqlи поставить дополнительную "-E" (или "--echo-hidden"), а затем выполните приведенную выше команду.
после некоторых поисков, я смог найти
information_schema.routinesтаблицы иinformation_schema.parametersтаблицы. Используя их, можно построить запрос для этой цели. Левое соединение, а не соединение, необходимо для извлечения функций без параметров.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;
если кто-то заинтересован вот какой запрос выполняется
psqlна postgres 9.1: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;вы можете получить то, что
psqlвыполняется для команды обратной косой черты, запустивpsqlС-Eфлаг.
есть удобная функция,
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';кредит Leo Hsu и Regina Obe в Postgres Online указал
oidvectortypes. Я писал подобные функции раньше, но использовал сложные вложенные выражения, которые эта функция избавляет от необходимости.
(редактировать в 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таблицы - см.routinesиparametersна ответ @ RuddZwolinski.
функции OID (см.
pg_catalog.pg_proc) и функции specific_name (см.information_schema.routines) являются основными опциями для функций. Ниже приведены некоторые полезные функции в отчетности и других контекстах.--- --- --- --- --- --- Useful overloads: CREATE FUNCTION oidvectortypes(p_oid int) RETURNS text AS $$ SELECT oidvectortypes(proargtypes) FROM pg_proc WHERE oid=; $$ 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(, '^.+?([^_]+)$', '')::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(, '^.+?([^_]+)$', '')::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-запрос, чтобы создать представление, которое будет показывать все функции:
CREATE OR REPLACE VIEW show_functions AS SELECT routine_name FROM information_schema.routines WHERE routine_type='FUNCTION' AND specific_schema='public';
хорошая идея назвала функции с псевдонимом commun на первых словах для filtre имя с
LIKEПример с публичной схемой в Postgresql 9.4, обязательно замените его схемой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)
Comments