自定义一个聚合函数,实现字符串Group by 相加,为什么返回参数中文显示乱码?
服务器字符集:us7Ascii(服务器是另家公司的,字符集不可更改)
客户端字符集:us7Ascii
试过其他的非聚合函数,字符串相加不显乱码。函数如下:
-- 定义类型 聚合函数的实质就是一个对象
create or replace type strcat_type as object (
cat_string varchar2(4000),
--对象初始化
static function ODCIAggregateInitialize(cs_ctx In Out strcat_type)
return number,
--聚合函数的迭代方法(这是最重要的方法)
member function ODCIAggregateIterate(self In Out strcat_type,value in varchar2)
return number,
--当查询语句并行运行时,才会使用该方法,可将多个并行运行的查询结果聚合
member function ODCIAggregateMerge(self In Out strcat_type,ctx2 In Out strcat_type)
return number,
--终止聚集函数的处理,返回聚集函数处理的结果
member function ODCIAggregateTerminate(self In Out strcat_type,returnValue Out varchar2,flags in number)
return number
)
/
/* 创建主体类型 */
create or replace type body strcat_type is
static function ODCIAggregateInitialize(cs_ctx IN OUT strcat_type) return number
is
begin
cs_ctx := strcat_type( null );
return ODCIConst.Success;
end;
member function ODCIAggregateIterate(self IN OUT strcat_type,
value IN varchar2 )
return number
is
begin
/*字符串已','分割 */
self.cat_string := self.cat_string || ','|| value;
return ODCIConst.Success;
end;
member function ODCIAggregateTerminate(self IN Out strcat_type,
returnValue OUT varchar2,
flags IN number)
return number
is
begin
/*去除空(is null)*/
returnValue := ltrim(rtrim(self.cat_string,','),',');
return ODCIConst.Success;
end;
member function ODCIAggregateMerge(self IN OUT strcat_type,
ctx2 IN Out strcat_type)
return number
is
begin
self.cat_string := self.cat_string || ',' || ctx2.cat_string;
return ODCIConst.Success;
end;
end;
/
/*创建函数 func_strcat*/
CREATE OR REPLACE FUNCTION func_strcat(input varchar2 )
RETURN varchar2 -- 返回值
PARALLEL_ENABLE AGGREGATE USING strcat_type; --使平行累加
/
服务器字符集:us7Ascii(服务器是另家公司的,字符集不可更改)
客户端字符集:us7Ascii
试过其他的非聚合函数,字符串相加不显乱码。函数如下:
-- 定义类型 聚合函数的实质就是一个对象
create or replace type strcat_type as object (
cat_string varchar2(4000),
--对象初始化
static function ODCIAggregateInitialize(cs_ctx In Out strcat_type)
return number,
--聚合函数的迭代方法(这是最重要的方法)
member function ODCIAggregateIterate(self In Out strcat_type,value in varchar2)
return number,
--当查询语句并行运行时,才会使用该方法,可将多个并行运行的查询结果聚合
member function ODCIAggregateMerge(self In Out strcat_type,ctx2 In Out strcat_type)
return number,
--终止聚集函数的处理,返回聚集函数处理的结果
member function ODCIAggregateTerminate(self In Out strcat_type,returnValue Out varchar2,flags in number)
return number
)
/
/* 创建主体类型 */
create or replace type body strcat_type is
static function ODCIAggregateInitialize(cs_ctx IN OUT strcat_type) return number
is
begin
cs_ctx := strcat_type( null );
return ODCIConst.Success;
end;
member function ODCIAggregateIterate(self IN OUT strcat_type,
value IN varchar2 )
return number
is
begin
/*字符串已','分割 */
self.cat_string := self.cat_string || ','|| value;
return ODCIConst.Success;
end;
member function ODCIAggregateTerminate(self IN Out strcat_type,
returnValue OUT varchar2,
flags IN number)
return number
is
begin
/*去除空(is null)*/
returnValue := ltrim(rtrim(self.cat_string,','),',');
return ODCIConst.Success;
end;
member function ODCIAggregateMerge(self IN OUT strcat_type,
ctx2 IN Out strcat_type)
return number
is
begin
self.cat_string := self.cat_string || ',' || ctx2.cat_string;
return ODCIConst.Success;
end;
end;
/
/*创建函数 func_strcat*/
CREATE OR REPLACE FUNCTION func_strcat(input varchar2 )
RETURN varchar2 -- 返回值
PARALLEL_ENABLE AGGREGATE USING strcat_type; --使平行累加
/
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货