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
阅读(1632) | 评论(0) | 转发(0) |