PostgreSQL에서 특정 스키마의 데이터베이스에 저장된 모든 함수 목록을 어떻게 얻을 수 있습니까?


135

PostgreSQL 데이터베이스에 연결하고 특정 스키마에 대한 모든 기능을 찾고 싶습니다.

내 생각에 pg_catalog 또는 information_schema에 쿼리를 작성하고 모든 함수 목록을 얻을 수 있지만 이름과 매개 변수가 저장된 위치를 알 수는 없습니다. 함수 이름과 매개 변수 유형 및 순서를 알려주는 쿼리를 찾고 있습니다.

이 방법이 있습니까?

답변:


191
\df <schema>.*

psql필요한 정보 를 제공합니다.

내부적으로 사용되는 쿼리를 보려면 psql추가 " -E"(또는 " --echo-hidden") 옵션 을 사용하여 데이터베이스에 연결 하고 위의 명령을 실행하십시오.


1
해당 검색어를 붙여 넣을 수 있습니까?
— Rudd Zwolinski

3
n.nspname을 "스키마"로, p.proname을 "이름"으로, pg_catalog.pg_get_function_result (p.oid)를 "결과 데이터 유형"으로, pg_catalog.pg_get_function_arguments (p.oid)를 "인수 데이터 유형"으로, CASE WHEN p .proisagg THEN 'agg'언제 p.proiswindow THEN 'window'WHEN p.prorettype = 'pg_catalog.trigger':: pg_catalog.regtype THEN 'trigger'ELSE 'normal'은 "Type"으로 종료됩니다. pg_catalog.pg_proc p LEFT JOIN pg_catalog .pg_namespace n ON n.oid = p.pronamespace 어디서 n.nspname ~ '^ (public) $'ORDER BY 1, 2, 4; 위는 \ set ECHO_HIDDEN 'on'에서 생성 된 쿼리입니다.
— Simon D

90

검색 한 후 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;

2
oidvectortypes정말 유용 할 것 입니다. 새로운 답변보기 : stackoverflow.com/a/24034604/398670
— Craig Ringer

위의 코드는 모든 기능을 표시하지는 않습니다. 입력 매개 변수가없는 기능을 표시하려면 JOIN 대신 LEFT JOIN이 필요합니다.
— David

35

psqlpostgres 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


방금 답변을 찾아 Postgres 11.5에서 쿼리를 시도했습니다. 그것은 말한다 :ERROR: column p.proisagg does not exist
— 크리스티안 Westerbeek

이것에 감사합니다; 가장 인기있는 두 답변은 내 기능을 보여주지 못했습니다!
— machineghost

29

편리한 기능이 있습니다 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및 parametersRuddZwolinski의 대답 @에서.


함수의 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))?
— 피터 크라우스

1
@PeterKrauss의 oid열입니다 pg_proc. 숨겨진 열입니다.
— Craig Ringer

1
확장에 종속적 인 기능 (예 : PostGIS의 기능)을 제외하는 방법에 대해서는 stackoverflow.com/a/25388031/161040 을 참조하십시오 .
— Simon D

20

SQL 쿼리 아래에서 실행하여 모든 기능을 표시하는보기를 작성하십시오.

CREATE OR REPLACE VIEW show_functions AS
    SELECT routine_name FROM information_schema.routines 
        WHERE routine_type='FUNCTION' AND specific_schema='public';

10

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%';

4

예:

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)

5
Milen의 답변과 다른 점은 무엇입니까?
— a_horse_with_no_name

3
이것은 쿼리가 아니며 psqlPostgres 클라이언트 인터페이스 의 명령입니다 . 이것은 작동하며 psql기술적으로 SQL 쿼리가 아닙니다.
— GregT

3

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;

2

이 함수는 현재 데이터베이스의 모든 사용자 정의 루틴을 리턴합니다.

SELECT pg_get_functiondef(p.oid) FROM pg_proc p
INNER JOIN pg_namespace ns ON p.pronamespace = ns.oid
WHERE ns.nspname = 'public';
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.