`

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

    博客分类:
  • db
 
阅读更多

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

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

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

  1. create or replace type distinct_concat_type as object  
  2. (  
  3. --对象变量  
  4.   cat_string varchar2(500),  
  5. --对象初始化  
  6.   static function ODCIAggregateInitialize(cs_ctx In Out distinct_concat_type)  
  7.     return number,  
  8. --聚合函数的迭代方法  
  9.   member function ODCIAggregateIterate(self  In Out distinct_concat_type,  
  10.                                        value in varchar2) return number,  
  11. --当查询语句并行运行时,才会使用该方法,可将多个并行运行的查询结果聚合  
  12.   member function ODCIAggregateMerge(self In Out distinct_concat_type,  
  13.                                      ctx2 In Out distinct_concat_type)  
  14.     return number,  
  15. --终止聚集函数的处理,返回聚集函数处理的结果  
  16.   member function ODCIAggregateTerminate(self        In Out distinct_concat_type,  
  17.                                          returnValue Out varchar2,  
  18.                                          flags       in number)  
  19.     return number  
  20. )  

接着实现对象主体:

  1. create or replace type body distinct_concat_type is  
  2.   --对象初始化  
  3.   static function ODCIAggregateInitialize(cs_ctx IN OUT distinct_concat_type)  
  4.     return number is  
  5.   begin  
  6.     cs_ctx := distinct_concat_type(null);  
  7.     return ODCIConst.Success;  
  8.   end;  
  9.   
  10.   --聚合函数的迭代方法  
  11.   member function ODCIAggregateIterate(self  IN OUT distinct_concat_type,  
  12.                                        value IN varchar2) return number is  
  13.   begin  
  14.     if self.cat_string is null or (instr(self.cat_string, value, 1, 1) = 0) then  
  15.       self.cat_string := self.cat_string || ',' || value;  
  16.     end if;  
  17.     return ODCIConst.Success;  
  18.   end;  
  19.   
  20.   --当查询语句并行运行时,才会使用该方法,可将多个并行运行的查询结果聚合  
  21.   member function ODCIAggregateMerge(self IN OUT distinct_concat_type,  
  22.                                      ctx2 IN Out distinct_concat_type)  
  23.     return number is  
  24.   begin  
  25.     if self.cat_string is null or  
  26.        (instr(self.cat_string, ctx2.cat_string, 1, 1) = 0) then  
  27.       self.cat_string := self.cat_string || ',' || ctx2.cat_string;  
  28.     end if;  
  29.     return ODCIConst.Success;  
  30.   end;  
  31.   
  32.   --终止聚集函数的处理,返回聚集函数处理的结果  
  33.   member function ODCIAggregateTerminate(self        IN Out distinct_concat_type,  
  34.                                          returnValue OUT varchar2,  
  35.                                          flags       IN number) return number is  
  36.   begin  
  37.     returnValue := ltrim(rtrim(self.cat_string, ','), ',');  
  38.     return ODCIConst.Success;  
  39.   end;  
  40. end;  


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

  1. create or replace function distinct_concat(input varchar2) return varchar2  
  2.   parallel_enable  
  3.   aggregate using distinct_concat_type; 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics