本文介绍创建聚合函数的方法。
背景说明
Oracle中支持为自定义聚合函数开启并行,在PolarDB O引擎中同样是支持的,但是语法有些差异。这里介绍下PolarDB O引擎中如何创建自定义聚合函数、开启并行。
解决方案
在PolarDB O引擎中创建自定义聚合函数的语法:
CREATE AGGREGATE name ( [ argmode ] [ argname ] arg_data_type [ , ... ] ) (
SFUNC = sfunc,
STYPE = state_data_type
[ , SSPACE = state_data_size ]
[ , FINALFUNC = ffunc ]
[ , FINALFUNC_EXTRA ]
[ , FINALFUNC_MODIFY = { READ_ONLY | SHAREABLE | READ_WRITE } ]
[ , COMBINEFUNC = combinefunc ]
[ , SERIALFUNC = serialfunc ]
[ , DESERIALFUNC = deserialfunc ]
[ , INITCOND = initial_condition ]
[ , MSFUNC = msfunc ]
[ , MINVFUNC = minvfunc ]
[ , MSTYPE = mstate_data_type ]
[ , MSSPACE = mstate_data_size ]
[ , MFINALFUNC = mffunc ]
[ , MFINALFUNC_EXTRA ]
[ , MFINALFUNC_MODIFY = { READ_ONLY | SHAREABLE | READ_WRITE } ]
[ , MINITCOND = minitial_condition ]
[ , SORTOP = sort_operator ]
[ , PARALLEL = { SAFE | RESTRICTED | UNSAFE } ]
)
示例
PolarDB O引擎中支持常规的聚合函数,如果需要实现特殊功能,您可以自定义相关函数即可(sfunc、stype、FINALFUNC)。
例如,指定符号连接聚合,同时适用于大部分场景:
create aggregate launch_concat(text,text) (
sfunc = pg_catalog.string_agg_transfn,
stype = internal,
FINALFUNC = pg_catalog.string_agg_finalfn
);
结果为:
select launch_concat(id::text, ',') from generate_series(1,10) t(id);
launch_concat
----------------------
1,2,3,4,5,6,7,8,9,10