原帖:http://www.cnblogs.com/changhai-xuri/archive/2006/11/05/550811.html
oracle自定义聚集函数接口简介
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
a. static
function ODCIAggregateInitialize(sctx
IN OUT string_agg_type )
return
number
自定义聚集函数初始化设置,从这儿开始一个聚集函数
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
b. member
function ODCIAggregateIterate(self
IN OUT string_agg_type ,value
IN
varchar2)
return
number
自定义聚集函数,最主要的步骤,这个函数定义我们的聚集函数具体做什么操作,后面的例子,是取最大值,最小值,平均值,还是做连接操作.self 为当前聚集函数的指针,用来与前面的计算结果进行关联
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
c. member
function ODCIAggregateMerge (self
IN string_agg_type,returnValue OUT
varchar2,flags
IN
number)
return
number
用来合并两个聚集函数的两个不同的指针对应的结果,用户合并不同结果结的数据,特别是处理并行(parallel)查询聚集函数的时候.
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
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
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
(
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
total
varchar2(
4000),
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
static
function
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
ODCIAggregateInitialize(sctx
IN OUT string_agg_type )
return
number,
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
member
function
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
ODCIAggregateIterate(self
IN OUT string_agg_type ,
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
value
IN
varchar2 )
return
number,
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
member
function
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
ODCIAggregateTerminate(self
IN string_agg_type,
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
returnValue OUT
varchar2,
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
flags
IN
number)
return
number,
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
member
function
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
ODCIAggregateMerge(self
IN OUT string_agg_type,
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
ctx2
IN string_agg_type)
return
number
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
);
/
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
Type created.
create
or
replace type body string_agg_type
is
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
static
function ODCIAggregateInitialize(sctx
IN OUT string_agg_type)
return
number
is
begin
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
sctx :
= string_agg_type(
null );
return ODCIConst.Success;
end;
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
member
function ODCIAggregateIterate(self
IN OUT string_agg_type,
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
value
IN
varchar2 )
return
number
is
begin
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
self.total :
= self.total
||
'
,
'
|| value;
return ODCIConst.Success;
end;
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
member
function ODCIAggregateTerminate(self
IN string_agg_type,
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
returnValue OUT
varchar2,
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
flags
IN
number)
return
number
is
begin
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
returnValue :
=
ltrim(self.total,
'
,
');
return ODCIConst.Success;
end;
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
member
function ODCIAggregateMerge(self
IN OUT string_agg_type,
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
ctx2
IN string_agg_type)
return
number
is
begin
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
self.total :
= self.total
|| ctx2.total;
return ODCIConst.Success;
end;
end;
/
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
Type body created.
CREATE
or
replace
FUNCTION stragg(input
varchar2 )
RETURN
varchar2
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
PARALLEL_ENABLE AGGREGATE USING string_agg_type;
/
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
scott
@ORA9I.WORLD
>
select deptno, stragg(ename)
2
from emp
3
group
by deptno
4
/
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
DEPTNO
--
--------
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
STRAGG(ENAME)
--
-------------------------------------------------------------------------------
--
------------------------------------------------
10
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
CLARK,KING,MILLER
20
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
SMITH,FORD,ADAMS,SCOTT,JONES
30
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
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
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
static
function ODCIAggregateInitialize(sctx
IN OUT string_agg_type)
return
number
is
begin
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
sctx :
= string_agg_type( vcArray() );
return ODCIConst.Success;
end;
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
member
function ODCIAggregateIterate(self
IN OUT string_agg_type,
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
value
IN
varchar2 )
return
number
is
begin
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
data.extend;
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
data(data.
count) :
= value;
return ODCIConst.Success;
end;
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
member
function ODCIAggregateTerminate(self
IN string_agg_type,
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
returnValue OUT
varchar2,
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
flags
IN
number)
return
number
is
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
l_data
varchar2(
4000);
begin
for x
in (
select column_value
from
TABLE(data)
order
by
1 )
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
loop
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
l_data :
= l_data
||
'
,
'
|| x.column_value;
end loop;
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
returnValue :
=
ltrim(l_data,
'
,
');
return ODCIConst.Success;
end;
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
member
function ODCIAggregateMerge(self
IN OUT string_agg_type,
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
ctx2
IN string_agg_type)
return
number
is
begin
--
not really tested ;)
for i
in
1 .. ctx2.data.
count
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
loop
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
data.extend;
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
data(data.
count) :
= ctx2.data(i);
end loop;
return ODCIConst.Success;
end;
end;
/
CREATE
or
replace
FUNCTION stragg(input
varchar2 )
RETURN
varchar2
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
PARALLEL_ENABLE AGGREGATE USING string_agg_type;
/
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
ops$tkyte
@ORA9IR2
>
column ename format a40ops$tkyte
@ORA9IR2
>
select deptno, stragg(ename) ename
2
from emp
3
group
by deptno
4
/
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
DEPTNO ENAME
--
-------- ----------------------------------------
10 CLARK,KING,MILLER
20 ADAMS,FORD,JONES,SCOTT,SMITH
30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD