2015-01-12 1 views

답변

3

이런 식으로 뭔가,하지만이 집계를 만드는 모든 가능한 방법을 다루고 있는지 확실하지 않습니다 어떤 시스템을 사용하여

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 
+1

좋은 시작하지만, 인수해야 (p.proargtypes :: oid []) t)'(http://sqlfiddle.com/#!12/d0e8a 참조)와 같은 형태 여야합니다./2 - 또한 PostgreSQL 9.4+에는 더 많은 옵션과 유형의 사용자 정의 집계 함수가 있음을 알 수 있습니다. – pozs

+0

고마워. pg_get_functiondef와 비슷한 것이 있을지도 모른다고 생각했지만, no처럼 보입니다. – qingbo

+0

@pozs : 좋은 지적입니다. 이것에 대한 ['pg_get_function_identity_arguments()'] (https://www.postgresql.org/docs/current/static/functions-info.html#FUNCTIONS-INFO-CATALOG-TABLE)도 있습니다. 또는 더 우아하면서도 :'aggfnoid :: regprocedure'. 나는 업데이트 된 버전을 추가했다. –

0

내 버전 (확실히 계정에 인용 식별자의 필요성을지지 않습니다) 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; 
1

현대 버전은 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() 유사 - ... 모든 새로운 주요 포스트 그레스 버전 적용해야 할 수 있습니다

관련 문제