Chinaunix首页 | 论坛 | 博客
  • 博客访问: 117770
  • 博文数量: 31
  • 博客积分: 2035
  • 博客等级: 大尉
  • 技术积分: 339
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-29 07:30
文章分类
文章存档

2011年(1)

2010年(20)

2009年(10)

我的朋友

分类: Oracle

2010-06-18 19:36:53

create or replace type VAR_GROUP_OBJ as object ( 
    sum_string VARCHAR2(4000),
    static function ODCIAggregateInitialize(v_self in out VAR_GROUP_OBJ) return number, 
    member function ODCIAggregateIterate(self in out VAR_GROUP_OBJ, value in varchar2) return number, 
    member function ODCIAggregateMerge(self in out VAR_GROUP_OBJ, v_next in VAR_GROUP_OBJ) return number, 
    member function ODCIAggregateTerminate(self in VAR_GROUP_OBJ, return_value out VARCHAR2 ,v_flags in number) return number
)
/
create or replace type body VAR_GROUP_OBJ is
    static function ODCIAggregateInitialize(v_self in out VAR_GROUP_OBJ) return number is
    begin
        v_self := VAR_GROUP_OBJ(null);
        return ODCICONST.Success;
    end;
    member function ODCIAggregateIterate(self in out VAR_GROUP_OBJ, value in varchar2) return number is
    begin 
         self.sum_string := self.sum_string || value||'|';
         return ODCICONST.Success; 
         if self.sum_string<value then
             self.sum_string:=value;
         end if; 
         if self.sum_string>value then
self.sum_string:=value;
         end if;
          
         return ODCICONST.Success;
    end;
    member function ODCIAggregateMerge(self in out VAR_GROUP_OBJ, v_next in VAR_GROUP_OBJ) return number is
    begin 
         self.sum_string := self.sum_string ||v_next.sum_string;
         return ODCICONST.Success; 
         if self.sum_string<v_next.sum_string then
             self.sum_string:=v_next.sum_string;
         end if; 
         if self.sum_string>v_next.sum_string then
             self.sum_string:=v_next.sum_string;
         end if; 
         return ODCICONST.Success;
    end;
    member function ODCIAggregateTerminate(self in VAR_GROUP_OBJ, return_value out VARCHAR2 ,v_flags in number) return number is
    begin
         return_value:= self.sum_string;
         return ODCICONST.Success;
    end;
end;
/
create or replace function GROUPCATVAR(value varchar2) return VARCHAR2
    parallel_enable aggregate using VAR_GROUP_OBJ;


测试select col1,GROUPCATVAR(col2) from table_name group by col1;

对于连接后的数据较大该函数就不适应,需要改进,请参考http://blog.chinaunix.net/u3/97653/showart.php?id=2255720

阅读(1577) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~