作者: qzj_jo2005 发表日期: 2008-04-02 10:34:00
在项目经常在group by 时想把字符串也累计出来,如:
select min(t.weighttime), --过衡最小时间
max(t.weighttime),--过衡最大时间
sum(t.netweight), --重量
count(t.truckboxid),--车数
t.boxlicence -- 车皮号
from truckweighboxes t
- /* Oracle自定义聚合函数实现字符串连接 */
- -- 定义类型 聚合函数的实质就是一个对象
- create or replace type strcat_type as object (
- cat_string varchar2(4000),
- --对象初始化
- static function ODCIAggregateInitialize(cs_ctx In Out strcat_type)
- return number,
- --聚合函数的迭代方法(这是最重要的方法)
- member function ODCIAggregateIterate(self In Out strcat_type,value in varchar2)
- return number,
- --当查询语句并行运行时,才会使用该方法,可将多个并行运行的查询结果聚合
- member function ODCIAggregateMerge(self In Out strcat_type,ctx2 In Out strcat_type)
- return number,
- --终止聚集函数的处理,返回聚集函数处理的结果
- member function ODCIAggregateTerminate(self In Out strcat_type,returnValue Out varchar2,flags in number)
- return number
- )
- /
- /* 创建主体类型 */
- create or replace type body strcat_type is
- static function ODCIAggregateInitialize(cs_ctx IN OUT strcat_type) return number
- is
- begin
- cs_ctx := strcat_type( null );
- return ODCIConst.Success;
- end;
- member function ODCIAggregateIterate(self IN OUT strcat_type,
- value IN varchar2 )
- return number
- is
- begin
- /*字符串已','分割 */
- self.cat_string := self.cat_string || ','|| value;
- return ODCIConst.Success;
- end;
- member function ODCIAggregateTerminate(self IN Out strcat_type,
- returnValue OUT varchar2,
- flags IN number)
- return number
- is
- begin
- /*去除空(is null)*/
- returnValue := ltrim(rtrim(self.cat_string,','),',');
- return ODCIConst.Success;
- end;
- member function ODCIAggregateMerge(self IN OUT strcat_type,
- ctx2 IN Out strcat_type)
- return number
- is
- begin
- self.cat_string := self.cat_string || ',' || ctx2.cat_string;
- return ODCIConst.Success;
- end;
- end;
- /
- /*创建函数 func_strcat*/
- CREATE OR REPLACE FUNCTION func_strcat(input varchar2 )
- RETURN varchar2 -- 返回值
- PARALLEL_ENABLE AGGREGATE USING strcat_type; --使平行累加
- /
测试结果
- select min(t.weighttime), --过衡最小时间
- max(t.weighttime),--过衡最大时间
- sum(t.netweight), --重量
- count(t.truckboxid),--车数
- func_strcat(t.boxlicence) -- 车皮号
- from truckweighboxes t
- where rownum <= 20
mintime maxtime netweight
2006-12-31 9:00:09 2007-1-3 16:07:44 415.91
boxlicence(车皮号) : 06175,53645,61690,55033,61379,
53807,55005,52019,53905,51068,53670,53861,53856,80507,9007,9066,62301,53670,61095,55005
注意:oracel varchar2 最大不能超过4000字符(超出后错误:ora-06502:PL/SQL:numeric or value erro:character string buffer too small), 如果超过请使用clob或blob类型来处理。
[ 尊重原创,未经允许请勿转载本站日志 ]
共 0 条评论 »
我来说几句: