มีฟังก์ชั่นที่สะดวก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';
เครดิตสิงห์ Hsu และ Regina Obe ที่ Postgres ออนไลน์oidvectortypes
สำหรับการชี้ออก ฉันเคยเขียนฟังก์ชันที่คล้ายกันมาก่อน แต่ใช้นิพจน์ซ้อนที่ซับซ้อนซึ่งฟังก์ชันนี้ไม่จำเป็นต้องใช้
ดูคำตอบที่เกี่ยวข้อง
(แก้ไขปี 2559)
การสรุปตัวเลือกรายงานทั่วไป:
SELECT format('%I.%I(%s)', ns.nspname, p.proname, oidvectortypes(p.proargtypes))
SELECT format(
'%I.%I(%s)=%s',
ns.nspname, p.proname, oidvectortypes(p.proargtypes),
pg_get_function_result(p.oid)
)
SELECT format('%I.%I(%s)', ns.nspname, p.proname, pg_get_function_arguments(p.oid))
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
) และชื่อเฉพาะของฟังก์ชัน(ดู information_schema.routines
) เป็นตัวเลือกอ้างอิงหลักของฟังก์ชัน ด้านล่างนี้เป็นฟังก์ชันที่มีประโยชน์ในการรายงานและบริบทอื่น ๆ
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 $$
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 $$
SELECT pg_get_function_arguments(regexp_replace($1, '^.+?([^_]+)$', '\1')::int)
$$ LANGUAGE SQL IMMUTABLE;
CREATE FUNCTION pg_get_function_arguments2(p_specific_name text) RETURNS text AS $$
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;