oracle11g ora 29927,listagg函数 ORA-01489 result of string concatenation is too long的解决办法 【博森瑞】...
listagg函数 ORA-01489: result of string concatenation is too long的解决办法
概述
listagg 函数是Oracle 11g推出的一个分组函数,可以将字符串按分组连接起来.
SQL> select deptno ,listagg(ename,'->') within group ( order by ename)
2 from scott.emp
3 group by deptno;
DEPTNO LISTAGG(ENAME,'->')WITHINGROUP
------ --------------------------------------------------------------------------------
10 CLARK->KING->MILLER
20 ADAMS->FORD->JONES->SCOTT->SMITH
30 ALLEN->BLAKE->JAMES->MARTIN->TURNER->WARD
需要注意的是listagg函数只能返回VARCHAR2和rac类型的值.
The return data type is RAW if the measure column is RAW; otherwise the return value is VARCHAR2.(以上内容摘自官方文档)
varcahr2 最多可以容纳4000个字符 具体内容参见:Oracle数据类型限制
#ORA-01489: result of string concatenation is too long
如果我们运行下面的程序则会触发ORA-01489错误
SQL> select listagg(rownum,'->') within group ( order by rownum)
2 from dual
3 connect by level <=1000 ;
select listagg(rownum,'->') within group ( order by rownum)
from dual
connect by level <=1000
ORA-01489: result of string concatenation is too long
我们来看一下ORA-01489这个报错的详细信息
[oracle@server ~]$ oerr ora 1489
01489, 00000, "result of string concatenation is too long"
// *Cause: String concatenation result is more than the maximum size.
原因:字符串连接结果超出了最大尺寸
// *Action: Make sure that the result is less than the maximum size.
而Oracle中能存储字符串最多的数据类型为CLOB.所以需要我们自写函数解这个问题
自定义聚集函数
对象声明部分
create or replace type dao_connect_impl as object
(
RES clob,
static function ODCIAggregateInitialize(sctx IN OUT dao_connect_impl)
return number,
member function ODCIAggregateIterate(self IN OUT dao_connect_impl,
value IN VARCHAR2) return number,
member function ODCIAggregateTerminate(self IN dao_connect_impl,
returnValue OUT clob, flags IN NUMBER) return number,
member function ODCIAggregateMerge(self IN OUT dao_connect_impl,
ctx2 IN dao_connect_impl) return number
)
对象实现部分
create or replace type body dao_connect_impl is
static function ODCIAggregateInitialize(sctx IN OUT dao_connect_impl)
return number is
begin
sctx := dao_connect_impl(null);
return ODCIConst.Success;
end;
member function ODCIAggregateIterate(self IN OUT dao_connect_impl, value IN VARCHAR2) return number is
begin
SELF.RES :=SELF.RES||','||VALUE ;
return ODCIConst.Success;
end;
member function ODCIAggregateTerminate(self IN dao_connect_impl,
returnValue OUT clob, flags IN number) return number is
begin
returnValue := ltrim(self.RES,',');
return ODCIConst.Success;
end;
member function ODCIAggregateMerge(self IN OUT dao_connect_impl, ctx2 IN dao_connect
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)