ODCIAGGREGATE
功能描述
在Oracle兼容模式下,Vastbase G100支持使用ODCIAGGREGATE函数。用户可以通过实现一组统称为ODCIAGGREGATE的接口函数来自定义聚合函数,将这些函数实现为对象类型中的方法。当定义对象类型并在类型主体中实现函数时,使用CREATE FUNCTION ... AGGREGATE USING type_name
语句创建该聚合函数。
每个用户定义的聚合函数当前支持使用以下四个ODCIAGGREGATE函数或步骤来定义任何聚合函数执行的内部操作,包括初始化、迭代、合并和终止。
函数名称 | 说明 |
---|---|
ODCIAggregateInitialize | 初始化聚合上下文和实现对象类型的实例,并将其作为OUT参数返回。 |
ODCIAggregateIterate | 通过处理输入值、更新然后返回聚合上下文来遍历输入行。NULL值在聚合期间被忽略,不会传递给函数。 |
ODCIAggregateMerge | 在用户定义聚合的求值期间,将两个聚合上下文合并到一个对象实例中。 |
ODCIAggregateTerminate | 将聚合上下文作为输入并返回生成的聚合值,并执行所有必要的清理,例如释放内存。 |
注意事项
该函数仅在数据库兼容模式为Oracle时支持(即数据库实例初始化时指定DBCOMPATIBILITY='A')。
该函数当前不支持并行聚合计算和向量化执行引擎。
该函数当前不支持与开窗函数以及DISTINCT一起配合使用。
定义接口函数ODCIAGGREGATE时,返回值类型只能是Number类型。
语法格式
CREATE TYPE SpatialUnionRoutines(
STATIC FUNCTION ODCIAggregateInitialize( ... ) ...,
MEMBER FUNCTION ODCIAggregateIterate(...) ... ,
MEMBER FUNCTION ODCIAggregateMerge(...) ...,
MEMBER FUNCTION ODCIAggregateTerminate(...)
);
CREATE TYPE BODY SpatialUnionRoutines IS
...
END;
CREATE FUNCTION SpatialUnion(x int) RETURN int
AGGREGATE USING SpatialUnionRoutines;
参数说明
ODCIAggregateInitialize()
STATIC FUNCTION ODCIAggregateInitialize( actx IN OUT <impltype>) RETURN NUMBER
参数 In/Out 说明 actx IN OUT 由例程初始化的聚合上下文。对于常规聚合情况,此值为NULL。在窗口聚合中,actx是上一个窗口的上下文。此对象实例将作为参数传递给下一个聚合例程。 ODCIAggregateIterate()
MEMBER FUNCTION ODCIAggregateIterate( self IN OUT <impltype>, val <inputdatatype>) RETURN NUMBER
参数 In/Out 说明 self IN OUT 作为输入,当前聚合上下文的值;作为输出,更新值。 val IN 正在聚合的输入值。 ODCIAggregateMerge()
MEMBER FUNCTION ODCIAggregateMerge( self IN OUT <impltype>, ctx2 IN <impltype>) RETURN NUMBER
参数 In/Out 说明 self IN OUT 在输入时,第一个聚合上下文的值;在输出时,两个合并的聚合上下文的结果值。 ctx2 IN 第二个聚合上下文的值。 ODCIAggregateTerminate()
MEMBER FUNCTION ODCIAggregateTerminate( self IN <impltype>, ReturnValue OUT <return_type>, flags IN number) RETURN NUMBER
参数 In/Out 说明 self IN 聚合上下文的值。 ctx2 OUT 生成的聚合值。 flags IN 表示各种选项的位向量。ODCI_AGGREGATE_REUSE_CTX的设置位指示上下文被重用,并且任何外部上下文都不应被释放。
示例
1、设置GUC参数behavior_compat_options
。
set behavior_compat_options='proc_outparam_override';
2、定义接口函数ODCIAGGREGATE。
create or replace type t_vowel_count as object (
g_count number,
static function ODCIAggregateInitialize(
p_ctx in out t_vowel_count
) return number,
member function ODCIAggregateIterate(
self in out t_vowel_count, p_string varchar2
) return number,
member function ODCIAggregateTerminate(
self in t_vowel_count, p_result out number, p_flags in number
) return number,
member function ODCIAggregateMerge(
self in out t_vowel_count, p_ctx in t_vowel_count
) return number
);
create or replace type body t_vowel_count as
static function ODCIAggregateInitialize(
p_ctx in out t_vowel_count
) return number is
begin
p_ctx := t_vowel_count(null);
p_ctx.g_count := 0;
return ODCIConst.success;
end;
member function ODCIAggregateIterate(
self in out t_vowel_count, p_string varchar2
) return number is
begin
self.g_count := self.g_count + length(p_string) - length(translate(p_string, 'xaAeEiIoOuU', 'x'));
return ODCIConst.success;
end;
member function ODCIAggregateTerminate(
self in t_vowel_count, p_result out number, p_flags in number
) return number is
begin
p_result := self.g_count;
return ODCIConst.success;
end;
member function ODCIAggregateMerge(
self in out t_vowel_count, p_ctx in t_vowel_count
) return number is
begin
self.g_count := self.g_count + p_ctx.g_count;
return ODCIConst.success;
end;
end;
/
3、创建测试表并插入数据。
CREATE TABLE staff (
id INT,
name CHAR(9)
);
INSERT INTO staff (id, name) VALUES (1, 'Joe');
INSERT INTO staff (id, name) VALUES (2, 'Bob');
INSERT INTO staff (id, name) VALUES (3, 'Alice');
4、创建自定义聚合函数。
create or replace function vowel_count (p_string varchar2)
return number
parallel_enable
aggregate using t_vowel_count;
5、调用聚合函数。
SELECT vowel_count(name) FROM staff;
返回结果为:
vowel_count
------------
6
(1 row)