
a. static function ODCIAggregateInitialize(sctx IN OUT string_agg_type )

return number
自定义聚集函数初始化设置,从这儿开始一个聚集函数

b. member function ODCIAggregateIterate(self IN OUT string_agg_type ,value IN varchar2)

return number
自定义聚集函数,最主要的步骤,这个函数定义我们的聚集函数具体做什么操作,后面的例子,是取最大值,最小值,平均值,还是做连接操作.self 为当前聚集函数的指针,用来与前面的计算结果进行关联

c. member function ODCIAggregateMerge (self IN string_agg_type,returnValue OUT varchar2,flags IN number)

return number
用来合并两个聚集函数的两个不同的指针对应的结果,用户合并不同结果结的数据,特别是处理并行(parallel)查询聚集函数的时候.

d. member function OCDIAggregateTerminate(self IN string_agg_type,returnValue OUT varchar2,flags IN number)
终止聚集函数的处理,返回聚集函数处理的结果
1、简单的合并(合并不需要排序)
原文:http://asktom.oracle.com/pls/ask/f?p=4950:8:::::F4950_P8_DISPLAYID:229614022562

create or replace type string_agg_type as object

(

total varchar2(4000),

static function

ODCIAggregateInitialize(sctx IN OUT string_agg_type )

return number,

member function

ODCIAggregateIterate(self IN OUT string_agg_type ,

value IN varchar2 )

return number,

member function

ODCIAggregateTerminate(self IN string_agg_type,

returnValue OUT varchar2,

flags IN number)

return number,

member function

ODCIAggregateMerge(self IN OUT string_agg_type,

ctx2 IN string_agg_type)

return number

);

/

Type created.

create or replace type body string_agg_type

is

static function ODCIAggregateInitialize(sctx IN OUT string_agg_type)

return number

is

begin

sctx := string_agg_type( null );

return ODCIConst.Success;

end;

member function ODCIAggregateIterate(self IN OUT string_agg_type,

value IN varchar2 )

return number

is

begin

self.total := self.total || ',' || value;

return ODCIConst.Success;

end;

member function ODCIAggregateTerminate(self IN string_agg_type,

returnValue OUT varchar2,

flags IN number)

return number

is

begin

returnValue := ltrim(self.total,',');

return ODCIConst.Success;

end;

member function ODCIAggregateMerge(self IN OUT string_agg_type,

ctx2 IN string_agg_type)

return number

is

begin

self.total := self.total || ctx2.total;

return ODCIConst.Success;

end;

end;

/

Type body created.

CREATE or replace

FUNCTION stragg(input varchar2 )

RETURN varchar2

PARALLEL_ENABLE AGGREGATE USING string_agg_type;

/

scott@ORA9I.WORLD> select deptno, stragg(ename)

2 from emp

3 group by deptno

4 /

DEPTNO

----------

STRAGG(ENAME)

---------------------------------------------------------------------------------

--------------------------------------------------

10

CLARK,KING,MILLER

20

SMITH,FORD,ADAMS,SCOTT,JONES

30

ALLEN,BLAKE,MARTIN,TURNER,JAMES,WARD
2、简单的合并(合并的字符串要排序)
原文:http://asktom.oracle.com/pls/ask/f?p=4950:8:::::F4950_P8_DISPLAYID:15637744429336#16551777586484
除了用以下方法,还可以用上面1中的聚集函数以分析函数的方式使用,在over子句中排序来实现,可以参考
itpub上的文章:http://www.itpub.net/338337.html

create or replace type body string_agg_type

is

static function ODCIAggregateInitialize(sctx IN OUT string_agg_type)

return number

is

begin

sctx := string_agg_type( vcArray() );

return ODCIConst.Success;

end;

member function ODCIAggregateIterate(self IN OUT string_agg_type,

value IN varchar2 )

return number

is

begin

data.extend;

data(data.count) := value;

return ODCIConst.Success;

end;

member function ODCIAggregateTerminate(self IN string_agg_type,

returnValue OUT varchar2,

flags IN number)

return number

is

l_data varchar2(4000);

begin

for x in ( select column_value from TABLE(data) order by 1 )

loop

l_data := l_data || ',' || x.column_value;

end loop;

returnValue := ltrim(l_data,',');

return ODCIConst.Success;

end;

member function ODCIAggregateMerge(self IN OUT string_agg_type,

ctx2 IN string_agg_type)

return number

is

begin -- not really tested ;)

for i in 1 .. ctx2.data.count

loop

data.extend;

data(data.count) := ctx2.data(i);

end loop;

return ODCIConst.Success;

end;

end;

/

CREATE or replace

FUNCTION stragg(input varchar2 )

RETURN varchar2

PARALLEL_ENABLE AGGREGATE USING string_agg_type;

/

ops$tkyte@ORA9IR2> column ename format a40ops$tkyte@ORA9IR2> select deptno, stragg(ename) ename

2 from emp

3 group by deptno

4 /

DEPTNO ENAME

---------- ----------------------------------------

10 CLARK,KING,MILLER

20 ADAMS,FORD,JONES,SCOTT,SMITH

30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD
oracle自定义聚集函数接口简介

a. static function ODCIAggregateInitialize(sctx IN OUT string_agg_type )

return number
自定义聚集函数初始化设置,从这儿开始一个聚集函数

b. member function ODCIAggregateIterate(self IN OUT string_agg_type ,value IN varchar2)

return number
自定义聚集函数,最主要的步骤,这个函数定义我们的聚集函数具体做什么操作,后面的例子,是取最大值,最小值,平均值,还是做连接操作.self 为当前聚集函数的指针,用来与前面的计算结果进行关联

c. member function ODCIAggregateMerge (self IN string_agg_type,returnValue OUT varchar2,flags IN number)

return number
用来合并两个聚集函数的两个不同的指针对应的结果,用户合并不同结果结的数据,特别是处理并行(parallel)查询聚集函数的时候.

d. member function OCDIAggregateTerminate(self IN string_agg_type,returnValue OUT varchar2,flags IN number)
终止聚集函数的处理,返回聚集函数处理的结果
1、简单的合并(合并不需要排序)
原文:http://asktom.oracle.com/pls/ask/f?p=4950:8:::::F4950_P8_DISPLAYID:229614022562

create or replace type string_agg_type as object

(

total varchar2(4000),

static function

ODCIAggregateInitialize(sctx IN OUT string_agg_type )

return number,

member function

ODCIAggregateIterate(self IN OUT string_agg_type ,

value IN varchar2 )

return number,

member function

ODCIAggregateTerminate(self IN string_agg_type,

returnValue OUT varchar2,

flags IN number)

return number,

member function

ODCIAggregateMerge(self IN OUT string_agg_type,

ctx2 IN string_agg_type)

return number

);

/

Type created.

create or replace type body string_agg_type

is

static function ODCIAggregateInitialize(sctx IN OUT string_agg_type)

return number

is

begin

sctx := string_agg_type( null );

return ODCIConst.Success;

end;

member function ODCIAggregateIterate(self IN OUT string_agg_type,

value IN varchar2 )

return number

is

begin

self.total := self.total || ',' || value;

return ODCIConst.Success;

end;

member function ODCIAggregateTerminate(self IN string_agg_type,

returnValue OUT varchar2,

flags IN number)

return number

is

begin

returnValue := ltrim(self.total,',');

return ODCIConst.Success;

end;

member function ODCIAggregateMerge(self IN OUT string_agg_type,

ctx2 IN string_agg_type)

return number

is

begin

self.total := self.total || ctx2.total;

return ODCIConst.Success;

end;

end;

/

Type body created.

CREATE or replace

FUNCTION stragg(input varchar2 )

RETURN varchar2

PARALLEL_ENABLE AGGREGATE USING string_agg_type;

/

scott@ORA9I.WORLD> select deptno, stragg(ename)

2 from emp

3 group by deptno

4 /

DEPTNO

----------

STRAGG(ENAME)

---------------------------------------------------------------------------------

--------------------------------------------------

10

CLARK,KING,MILLER

20

SMITH,FORD,ADAMS,SCOTT,JONES

30

ALLEN,BLAKE,MARTIN,TURNER,JAMES,WARD
2、简单的合并(合并的字符串要排序)
原文:http://asktom.oracle.com/pls/ask/f?p=4950:8:::::F4950_P8_DISPLAYID:15637744429336#16551777586484
除了用以下方法,还可以用上面1中的聚集函数以分析函数的方式使用,在over子句中排序来实现,可以参考
itpub上的文章:http://www.itpub.net/338337.html

create or replace type body string_agg_type

is

static function ODCIAggregateInitialize(sctx IN OUT string_agg_type)

return number

is

begin

sctx := string_agg_type( vcArray() );

return ODCIConst.Success;

end;

member function ODCIAggregateIterate(self IN OUT string_agg_type,

value IN varchar2 )

return number

is

begin

data.extend;

data(data.count) := value;

return ODCIConst.Success;

end;

member function ODCIAggregateTerminate(self IN string_agg_type,

returnValue OUT varchar2,

flags IN number)

return number

is

l_data varchar2(4000);

begin

for x in ( select column_value from TABLE(data) order by 1 )

loop

l_data := l_data || ',' || x.column_value;

end loop;

returnValue := ltrim(l_data,',');

return ODCIConst.Success;

end;

member function ODCIAggregateMerge(self IN OUT string_agg_type,

ctx2 IN string_agg_type)

return number

is

begin -- not really tested ;)

for i in 1 .. ctx2.data.count

loop

data.extend;

data(data.count) := ctx2.data(i);

end loop;

return ODCIConst.Success;

end;

end;

/

CREATE or replace

FUNCTION stragg(input varchar2 )

RETURN varchar2

PARALLEL_ENABLE AGGREGATE USING string_agg_type;

/

ops$tkyte@ORA9IR2> column ename format a40ops$tkyte@ORA9IR2> select deptno, stragg(ename) ename

2 from emp

3 group by deptno

4 /

DEPTNO ENAME

---------- ----------------------------------------

10 CLARK,KING,MILLER

20 ADAMS,FORD,JONES,SCOTT,SMITH

30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)