VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

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)

相关文档

DROP AGGREGATE