PostgreSQL 데이터베이스에 연결하고 특정 스키마에 대한 모든 기능을 찾고 싶습니다.
내 생각에 pg_catalog 또는 information_schema에 쿼리를 작성하고 모든 함수 목록을 얻을 수 있지만 이름과 매개 변수가 저장된 위치를 알 수는 없습니다. 함수 이름과 매개 변수 유형 및 순서를 알려주는 쿼리를 찾고 있습니다.
이 방법이 있습니까?
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;
oidvectortypes
정말 유용 할 것 입니다. 새로운 답변보기 : stackoverflow.com/a/24034604/398670
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
ERROR: column p.proisagg does not exist
편리한 기능이 있습니다 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';
Postgres Online의 Leo Hsu와 Regina Obe 에게 신용 지적 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=$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;
proname
이름,하지만 어떻게 예를 들어,에 대한 OID를 얻는 것입니다. 에 사용 pg_catalog.pg_get_function_result(oid))
?
oid
열입니다 pg_proc
. 숨겨진 열입니다.
LIKE
PostgreSQL 9.4의 공개 스키마 로 예를 사용 하여 이름을 필터링하는 첫 번째 단어에 commun 별칭이있는 함수의 이름을 지정하는 것이 좋습니다. 그의 스키마로 대체하십시오.
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)
psql
Postgres 클라이언트 인터페이스 의 명령입니다 . 이것은 작동하며 psql
기술적으로 SQL 쿼리가 아닙니다.
function_schema 및 function_name 목록 가져 오기 ...
> select n.nspname as function_schema,
>
> p.proname as function_name
>
> from pg_proc p
>
> left join pg_namespace n on p.pronamespace = n.oid
>
> where n.nspname not in ('pg_catalog', 'information_schema')
>
> order by function_schema, function_name;