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테이블 - 참조 routinesparametersRuddZwolinski의 대답 @에서.


함수의 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.