ORACLE升级11g以上之前版本的wm_concat()函数失效
最近在项目中,进行oracle 10g升级到11g,原先使用的wm_concat()获取的数据,默认转为了LOB类型,导致进行前台使用时候,无法进行正确获取数据。下面有一解决方法:
先执行:
1 create or replace type string_sum_obj as object ( 2 --聚合函数的实质就是一个对象 3 sum_string varchar2(4000), 4 static function ODCIAggregateInitialize(v_self in out string_sum_obj) return number, 5 --对象初始化 6 member function ODCIAggregateIterate(self in out string_sum_obj, value in varchar2) return number, 7 --聚合函数的迭代方法(这是最重要的方法) 8 member function ODCIAggregateMerge(self in out string_sum_obj, v_next in string_sum_obj) return number, 9 --当查询语句并行运行时,才会使用该方法,可将多个并行运行的查询结果聚合 10 11 member function ODCIAggregateTerminate(self in string_sum_obj, return_value out varchar2 ,v_flags in number) return number 12 --终止聚集函数的处理,返回聚集函数处理的结果. 13 )
再执行:创建type具体
1 create or replace type body string_sum_obj is 2 static function ODCIAggregateInitialize(v_self in out string_sum_obj) return number is 3 begin 4 v_self := string_sum_obj(null); 5 return ODCICONST.Success; 6 end; 7 member function ODCIAggregateIterate(self in out string_sum_obj, value in varchar2) return number is 8 begin 9 /* 连接,解决逗号分隔第一个字母是逗号的问题 */ 10 if not self.sum_string is null then 11 self.sum_string := self.sum_string ||','|| value; 12 else 13 self.sum_string := self.sum_string || value; 14 end if; 15 return ODCICONST.Success; 16 /* 最大值 */ 17 if self.sum_string<value then 18 self.sum_string:=value; 19 end if; 20 /* 最小值 */ 21 if self.sum_string>value then 22 self.sum_string:=value; 23 end if; 24 25 return ODCICONST.Success; 26 end; 27 member function ODCIAggregateMerge(self in out string_sum_obj, v_next in string_sum_obj) return number is 28 begin 29 /* 连接 */ 30 self.sum_string := self.sum_string || v_next.sum_string; 31 return ODCICONST.Success; 32 /* 最大值 */ 33 if self.sum_string<v_next.sum_string then 34 self.sum_string:=v_next.sum_string; 35 end if; 36 37 /* 最小值 */ 38 if self.sum_string>v_next.sum_string then 39 self.sum_string:=v_next.sum_string; 40 end if; 41 42 return ODCICONST.Success; 43 end; 44 member function ODCIAggregateTerminate(self in string_sum_obj, return_value out varchar2 ,v_flags in number) return number is 45 begin 46 return_value:= self.sum_string; 47 return ODCICONST.Success; 48 end; 49 end;
最后执行:
1 create or replace function wm_concat(value Varchar2) return Varchar2 2 parallel_enable aggregate using string_sum_obj;
最后去执行WM_CONCAT()函数会发现,他的效果和以前一样一样!
作者:Peter Luo
本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。