惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
B
Blog
M
MIT News - Artificial intelligence
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
P
Proofpoint News Feed
C
Check Point Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
J
Java Code Geeks
博客园 - 叶小钗
S
SegmentFault 最新的问题
Last Week in AI
Last Week in AI
T
The Blog of Author Tim Ferriss
Microsoft Security Blog
Microsoft Security Blog
小众软件
小众软件
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 【当耐特】
腾讯CDC
博客园 - Franky
博客园 - 聂微东
V
Visual Studio Blog
GbyAI
GbyAI
Martin Fowler
Martin Fowler
罗磊的独立博客
Y
Y Combinator Blog

博客园 - changhai-xuri

[转]VS2005快捷键大全 <转载>C#基础面试题 转载(ASP.NET页面之间传递值的几种方式?) 面试的一些体会 程序之路对我来说有多远呢? 晕!我还是没办法改页面顶部的背景图片 关于开发模式的一点点思考 VB和VSS断绝往来了咋办? JAVA中对象的序列化 C#中的代理(Delegate) Spoolsv占用CPU100%的解决方案 Js文件中调用其它Js函数的方法 设计模式之策略模式探讨初步 设计模式之策略模式在设计一群鸭子中的应用 修改一下博客的式样 软件开发模式--软件开发教父与国内高手论道实录全文 微软公司软件开发模式简介 自己写的使用聚集函数实现多行字串合并处理 关于ORACLE中插入,更新(MERGE)的使用
(转载)使用自定义聚集函数来实现分组合并字符串
changhai-xuri · 2006-11-05 · via 博客园 - changhai-xuri

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