PostgreSQL에서 특정 스키마의 데이터베이스에 저장된 모든 함수 목록을 어떻게 얻을 수 있습니까?
PostgreSQL 데이터베이스에 연결하고 특정 스키마에 대한 모든 기능을 찾고 싶습니다.
내 생각에 pg_catalog 또는 information_schema에 대한 쿼리를 만들고 모든 함수 목록을 얻을 수 있지만 이름과 매개 변수가 저장된 위치를 알 수는 없습니다. 함수 이름과 매개 변수 유형 및 순서를 알려주는 쿼리를 찾고 있습니다.
이것을 할 수있는 방법이 있습니까?
\df <schema>.*
psql
필요한 정보 를 제공합니다.
내부적으로 사용되는 쿼리를 보려면 psql
추가 " -E
"(또는 " --echo-hidden
") 옵션 을 사용하여 데이터베이스에 연결 하고 위의 명령을 실행하십시오.
검색 한 후 information_schema.routines
테이블과 테이블 을 찾을 수있었습니다 information_schema.parameters
. 이를 사용하여 이러한 목적으로 쿼리를 구성 할 수 있습니다. 매개 변수없이 함수를 검색하려면 JOIN 대신 LEFT JOIN이 필요합니다.
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';
에 신용 포스트 그레스 온라인에서 레오 슈와 레지나 오리베 지적 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';
NOTICE: use p.proname||'_'||p.oid AS specific_name
to obtain unique names, or to JOIN with information_schema
tables — see routines
and parameters
at @RuddZwolinski's answer.
The function's OID (see pg_catalog.pg_proc
) and the function's specific_name (see information_schema.routines
) are the main reference options to functions. Below, some useful functions in reporting and other contexts.
--- --- --- --- ---
--- 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;
Run below SQL query to create a view which will show all functions:
CREATE OR REPLACE VIEW show_functions AS
SELECT routine_name FROM information_schema.routines
WHERE routine_type='FUNCTION' AND specific_schema='public';
Is a good idea named the functions with commun alias on the first words for filtre the name with LIKE
Example with public schema in Postgresql 9.4, be sure to replace with his scheme
SELECT routine_name FROM information_schema.routines WHERE routine_type='FUNCTION' AND specific_schema='public' AND routine_name LIKE 'aliasmyfunctions%';
Example:
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)
'developer tip' 카테고리의 다른 글
잘못된 속기 속성 이니셜 라이저 (0) | 2020.08.03 |
---|---|
오늘 자정에 타임 스탬프를 받고 있습니까? (0) | 2020.08.03 |
ng-change는 새로운 가치와 원래 가치를 얻습니다 (0) | 2020.08.03 |
ViewPager에서 탭을 사용할 때 "Java.lang.IllegalStateException 활동이 삭제되었습니다"오류가 발생 함 (0) | 2020.08.03 |
지정된 브라우저 (예 : Chrome)에서 파일을 여는 Sublime Text 2 키보드 단축키 (0) | 2020.08.03 |