PostgreSQL의 특정 스키마의 데이터베이스에 저장된 모든 함수 목록을 가져오려면 어떻게 해야 합니까?
Postgre에 연결할 수 있어야 합니다.SQL 데이터베이스를 사용하여 특정 스키마에 대한 모든 함수를 찾습니다.
저는 pg_catalog 또는 information_schema에 쿼리를 해서 모든 함수의 목록을 얻을 수 있다고 생각했지만, 이름과 매개 변수가 어디에 저장되어 있는지 알 수 없습니다.함수 이름과 함수에 필요한 매개 변수 유형(그리고 함수가 어떤 순서로 사용되는지)을 알려줄 쿼리를 찾고 있습니다.
이것을 할 수 있는 방법이 있습니까?
\df <schema>.*
에서 필요한 정보를 제공합니다.
내부적으로 사용된 쿼리를 보려면 다음을 사용하여 데이터베이스에 연결합니다.psql
그리고 여분의 "를 공급합니다.-E
(또는 "--echo-hidden
") 옵션을 선택한 다음 위의 명령을 실행합니다.
검색을 좀 한 후, 저는 테이블과 테이블을 찾을 수 있었습니다.이를 사용하여 이 목적을 위한 쿼리를 구성할 수 있습니다.매개 변수 없이 함수를 검색하려면 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';
포스트그레스 온라인의 Leo Hsu와 Regina Ove에게 지적한 공로를 인정합니다.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
@루드 즈볼린스키의 대답에.
함수의 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;
SQL 쿼리 아래에서 실행하여 모든 함수를 표시하는 보기를 만듭니다.
CREATE OR REPLACE VIEW show_functions AS
SELECT routine_name FROM information_schema.routines
WHERE routine_type='FUNCTION' AND specific_schema='public';
function_messages 및 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;
이름을 필터링하기 위해 첫 단어에 커뮤니티 별칭이 있는 함수로 이름을 지정하는 것이 좋습니다.LIKE
Postgresql 9.4에 공개 스키마가 있는 예제, 그의 스키마로 대체해야 합니다.
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)
이 함수는 현재 데이터베이스에 있는 모든 사용자 정의 루틴을 반환합니다.
SELECT pg_get_functiondef(p.oid) FROM pg_proc p
INNER JOIN pg_namespace ns ON p.pronamespace = ns.oid
WHERE ns.nspname = 'public';
위에서 언급한 답변의 조인은 입력 파라미터뿐만 아니라 출력도 반환합니다.따라서 parameter_mode도 지정해야 합니다.이 선택은 입력 파라미터가 있는 함수 목록(있는 경우)을 반환합니다.포스트그레스 14.
select r.routine_name, array_agg(p.data_type::text order by p.ordinal_position) from information_schema.routines r left join information_schema.parameters p on r.specific_name = p.specific_name
where r.routine_type = 'FUNCTION' and r.specific_schema = 'schema_name' and (p.parameter_mode = 'IN' or p.parameter_mode is null)
group by r.routine_name order by r.routine_name;
언급URL : https://stackoverflow.com/questions/1347282/how-can-i-get-a-list-of-all-functions-stored-in-the-database-of-a-particular-sch
'programing' 카테고리의 다른 글
Eclipse에서 문자열 대소문자 변경 (0) | 2023.05.20 |
---|---|
문자열에 대한 인쇄와 동등한 값을 얻습니다.Excel 형식 (0) | 2023.05.20 |
Git checkout: 경로 업데이트가 분기 전환과 호환되지 않습니다. (0) | 2023.05.20 |
제약 조건을 일시적으로 해제합니다(MS SQL). (0) | 2023.05.20 |
"gitrm -r"을 되돌리는 방법? (0) | 2023.05.20 |