by group 累加中文字段_自定义一个聚合函数,实现字符串Group by 相加,为什么返回参数中文显示乱码?...

在Oracle数据库中,由于服务器和客户端字符集为us7Ascii,导致自定义的聚合函数在进行字符串Group by相加时出现中文乱码。通过分析函数实现过程,探讨如何在保持原有字符集不变的情况下,修正中文乱码问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自定义一个聚合函数,实现字符串Group by 相加,为什么返回参数中文显示乱码?

服务器字符集(oralce 8i):us7Ascii(服务器是另家公司的,字符集不可更改)

客户端字符集(oracle 9i):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; --使平行累加

/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值