Es gibt eine praktische Funktion, oidvectortypes
, die das viel einfacher macht.
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';
Credit Leo Hsu and Regina Obe at Postgres Online für oidvectortypes
Hinweis. Ich habe zuvor ähnliche Funktionen geschrieben, aber komplexe verschachtelte Ausdrücke verwendet, für die diese Funktion nicht mehr benötigt wird.
See related answer.
(edit in 2016)
Fasst typischen Bericht Optionen:
-- 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';
HINWEIS: p.proname||'_'||p.oid AS specific_name
verwenden eindeutige Namen zu erhalten, oder mit information_schema
Tabellen JOIN — routines
und parameters
sehen bei @ RuddZwolinski's Antwort.
Die Funktion des OID (siehe pg_catalog.pg_proc
) und die der Funktion spezifischer_name (siehe information_schema.routines
) die wichtigsten Bezugsmöglichkeiten auf Funktionen sind. Unten finden Sie einige nützliche Funktionen in Berichten und anderen Kontexten.
--- --- --- --- ---
--- 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;
Sie finden 'oidvectortypes' auch sehr nützlich. Siehe neue Antwort: http://StackOverflow.com/a/24034604/398670 –
Der obige Code zeigt nicht alle Funktionen. Sie benötigen einen LINKEN JOIN anstelle von JOIN, um auch Funktionen ohne Eingabeparameter anzuzeigen. – David