내가 도움이 관련 답을 발견PostgreSQL에서 집계의 정의/소스 코드를 얻는 방법?
그러나 나는 GUI 클라이언트없이 CREATE AGGREGATE
문을 얻는 방법 (예를 들어, psql의 명령 라인)?
내가 도움이 관련 답을 발견PostgreSQL에서 집계의 정의/소스 코드를 얻는 방법?
그러나 나는 GUI 클라이언트없이 CREATE AGGREGATE
문을 얻는 방법 (예를 들어, psql의 명령 라인)?
이런 식으로 뭔가,하지만이 집계를 만드는 모든 가능한 방법을 다루고 있는지 확실하지 않습니다 어떤 시스템을 사용하여
SELECT 'create aggregate '||n.nspname||'.'||p.proname||'('||format_type(a.aggtranstype, null)||') (sfunc = '||a.aggtransfn
||', stype = '||format_type(a.aggtranstype, null)
||case when op.oprname is null then '' else ', sortop = '||op.oprname end
||case when a.agginitval is null then '' else ', initcond = '||a.agginitval end
||')' as source
FROM pg_proc p
JOIN pg_namespace n ON p.pronamespace = n.oid
JOIN pg_aggregate a ON a.aggfnoid = p.oid
LEFT JOIN pg_operator op ON op.oid = a.aggsortop
where p.proname = 'your_aggregate'
and n.nspname = 'public' --- replace with your schema name
내 버전 (확실히 계정에 인용 식별자의 필요성을지지 않습니다) format()
를 사용하여 간단하게 식별자 유형을 객체와에 따옴표 및 스키마 자격을 추가 캐스트 - 기능
SELECT
format(
E'CREATE AGGREGATE %s (\n%s\n);'
, (pg_identify_object('pg_proc'::regclass, aggfnoid, 0)).identity
, array_to_string(
ARRAY[
format(E'\tSFUNC = %s', aggtransfn::regproc)
, format(E'\tSTYPE = %s', format_type(aggtranstype, NULL))
, CASE aggfinalfn WHEN '-'::regproc THEN NULL ELSE format(E'\tFINALFUNC = %s',aggfinalfn::text) END
, CASE aggsortop WHEN 0 THEN NULL ELSE format(E'\tSORTOP = %s', oprname) END
, CASE WHEN agginitval IS NULL THEN NULL ELSE format(E'\tINITCOND = %s', agginitval) END
]
, E',\n'
)
)
FROM pg_aggregate
LEFT JOIN pg_operator ON pg_operator.oid = aggsortop
WHERE aggfnoid = 'regr_r2'::regproc;
현대 버전은 CREATE AGGREGATE
문을 생성하는 자동으로 필요한 식별자 : 'public.my_agg_func'::regproc
: 당신은 집계 함수의 이름 필요한 경우를 스키마받을 수
SELECT format('CREATE AGGREGATE %s (SFUNC = %s, STYPE = %s%s%s%s%s)'
, aggfnoid::regprocedure
, aggtransfn
, aggtranstype::regtype
, ', SORTOP = ' || NULLIF(aggsortop, 0)::regoper
, ', INITCOND = ' || agginitval
, ', FINALFUNC = ' || NULLIF(aggfinalfn, 0)
, CASE WHEN aggfinalextra THEN ', FINALFUNC_EXTRA' END
-- add more to cover special cases like moving-aggregate etc.
) AS ddl_agg
FROM pg_aggregate
WHERE aggfnoid = 'my_agg_func'::regproc; -- name of agg func here
.
오버로드 된 집계 함수의 경우 명확하게하기 위해 함수 매개 변수를 추가하십시오 ('array_agg(anyarray)'::regprocedure
).
이 기능은 이동 집계 기능과 같은 특수한 경우에는 적용되지 않습니다. 현재 Postgres 버전의 모든 옵션을 쉽게 확장 할 수 있습니다. 그러나 다음 주요 버전은 새로운 옵션을 가져올 수 있습니다.
함수 pg_get_aggregatedef()
이 사용자 지정 쿼리에 대한 필요성 제거하는 것이 좋을 것 기존 pg_get_functiondef()
유사 - ... 모든 새로운 주요 포스트 그레스 버전 적용해야 할 수 있습니다
좋은 시작하지만, 인수해야 (p.proargtypes :: oid []) t)'(http://sqlfiddle.com/#!12/d0e8a 참조)와 같은 형태 여야합니다./2 - 또한 PostgreSQL 9.4+에는 더 많은 옵션과 유형의 사용자 정의 집계 함수가 있음을 알 수 있습니다. – pozs
고마워. pg_get_functiondef와 비슷한 것이 있을지도 모른다고 생각했지만, no처럼 보입니다. – qingbo
@pozs : 좋은 지적입니다. 이것에 대한 ['pg_get_function_identity_arguments()'] (https://www.postgresql.org/docs/current/static/functions-info.html#FUNCTIONS-INFO-CATALOG-TABLE)도 있습니다. 또는 더 우아하면서도 :'aggfnoid :: regprocedure'. 나는 업데이트 된 버전을 추가했다. –