您的位置:首页 > 数据库 > Oracle

Oracle高级应用之去重聚合函数

2013-08-22 10:42 691 查看
开篇一笑:高中的时候,自行车被偷,早上顺路搭同学的自行车。我坐在后座看到前面一大妈跑步,很猥琐的对同学说:“你看前面那个肥婆跑得屁股都甩圆了!”这货沉默了一下。当我们和大妈擦身而过的时候,他喊道:“妈....”

本例实现的是连接字符串,并且去掉重复的项。

聚合函数实际上就是一个对象:

[sql]
view plaincopy

create or replace type distinct_concat_type as object  
(  
--对象变量  
  cat_string varchar2(500),  
--对象初始化  
  static function ODCIAggregateInitialize(cs_ctx In Out distinct_concat_type)  
    return number,  
--聚合函数的迭代方法  
  member function ODCIAggregateIterate(self  In Out distinct_concat_type,  
                                       value in varchar2) return number,  
--当查询语句并行运行时,才会使用该方法,可将多个并行运行的查询结果聚合  
  member function ODCIAggregateMerge(self In Out distinct_concat_type,  
                                     ctx2 In Out distinct_concat_type)  
    return number,  
--终止聚集函数的处理,返回聚集函数处理的结果  
  member function ODCIAggregateTerminate(self        In Out distinct_concat_type,  
                                         returnValue Out varchar2,  
                                         flags       in number)  
    return number  
)  

接着实现对象主体:

[sql]
view plaincopy

create or replace type body distinct_concat_type is  
  --对象初始化  
  static function ODCIAggregateInitialize(cs_ctx IN OUT distinct_concat_type)  
    return number is  
  begin  
    cs_ctx := distinct_concat_type(null);  
    return ODCIConst.Success;  
  end;  
  
  --聚合函数的迭代方法  
  member function ODCIAggregateIterate(self  IN OUT distinct_concat_type,  
                                       value IN varchar2) return number is  
  begin  
    if self.cat_string is null or (instr(self.cat_string, value, 1, 1) = 0) then  
      self.cat_string := self.cat_string || ',' || value;  
    end if;  
    return ODCIConst.Success;  
  end;  
  
  --当查询语句并行运行时,才会使用该方法,可将多个并行运行的查询结果聚合  
  member function ODCIAggregateMerge(self IN OUT distinct_concat_type,  
                                     ctx2 IN Out distinct_concat_type)  
    return number is  
  begin  
    if self.cat_string is null or  
       (instr(self.cat_string, ctx2.cat_string, 1, 1) = 0) then  
      self.cat_string := self.cat_string || ',' || ctx2.cat_string;  
    end if;  
    return ODCIConst.Success;  
  end;  
  
  --终止聚集函数的处理,返回聚集函数处理的结果  
  member function ODCIAggregateTerminate(self        IN Out distinct_concat_type,  
                                         returnValue OUT varchar2,  
                                         flags       IN number) return number is  
  begin  
    returnValue := ltrim(rtrim(self.cat_string, ','), ',');  
    return ODCIConst.Success;  
  end;  
end;  

最后定义函数,使用的是上面定义的对象:

[sql]
view plaincopy

create or replace function distinct_concat(input varchar2) return varchar2  
  parallel_enable  
  aggregate using distinct_concat_type; 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: