oracle自定义聚集函数实现列合并

原帖:http://www.cnblogs.com/changhai-xuri/archive/2006/11/05/550811.html


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值