select wm_concat(colA) as colA from tableA
java.sql.SQLException: ORA-06502: PL/SQL: 数字或值错误 : 字符串缓冲区太小 ORA-06512: 在 "WMSYS.WM_CONCAT_IMPL", line 30 )
wm_concat的最大长度只有4000,超过就会报错,
两种方法:
(1)转clob类型
select --wm_concat(colA) as colA
rtrim(xmlagg(xmlparse(content colA || ',' wellformed) ORDER BY colA).getclobval(),',') as colA from tableA;
(2)先转clob,再转varchar2,但是长度还是只能4000
select --wm_concat(colA) as colA
dbms_lob.substr(rtrim(xmlagg(xmlparse(content colA || ',' wellformed) ORDER BY colA).getclobval(),','),4000) as colA from tableA;
这是别人的方法:http://blog.csdn.net/l2tp1012/article/details/30744371
当执行sql:select wm_concat(colA) as colA from tableA提示:java.sql.SQLException: ORA-06502: PL/SQL: 数字或值错误 : 字符串缓冲区太小 ORA-06512: 在 "WMSYS.WM_CONCAT_IMPL", line 30 )wm_concat的最大长度只有4000,超过就会报错,
函数
wm
_
concat
(列名)该
函数
可以把列值以“,”号分隔起来,并显示成一行
但是进行拼串的时候,返回是
字符
串类型,可能遇到拼串形成的结果集大于
4000
,这时候,系统会提示,
超过
系统限制。
解决
办法
:
XMLAGG(XMLELEMENT(E, 列名 || ',')).EXTRACT('//text()').getclobval()
是先将列名组装成以“,”号分隔的xml,再转成
--使用这个sql查询返回值为:1,2,3,4,5,6,7,8,9
select listagg(id, ',') within group (order by id)
from (
select level as id from dual connect by level < 10
--但如果将level改成2000就
在我的BLOG中第一篇文章写的就是
字符
串聚合连接的例子:http://yangtingkun.itpub.net/post/468/3380。
后来还写过一篇用SQL实现相同功能的文章:http://yangtingkun.itpub.net/post/468/388003。
不过上面两种方法都会面临一个问题,就是如果聚集连接的
字符
串
长度
如果
超过
了VARCHAR2类型所允许的
最大
长度
,就会导致
描述:首先使用
WM
_
CONCAT
行转列,但是中间有一次出问题,所以前面加上了一个to_char(
WM
_
CONCAT
()),
这次是因为to_char的时候缓存
长度
不能
超过
4000
;
去掉to_char方法
WM
_
CONCAT
换成
RTRIM(XMLAGG(XMLPARSE(CONTENT 列名 || ',')) .GETCLOBVAL(), ',...
转:http://blog.itpub.net/28998293/viewspace-1353103/
Oracle
10g版本的
wm
_
concat
为varchar2(
4000
),在使用
wm
_
concat
函数
时,在
字符
串
长度
超过
4000
后报错,所以自定义一个类似的聚集
函数
,在内部使用CLOB
处理
,避免超长问题。
Oracle
11g版本的vm_
concat
返回类型为clob。
源码如下:--先
在进行使用
WM
_
CONCAT
进行列转行的
字符
串拼接时,可能会遇到
长度
超过
4000
的情况。这个时候
oracle
会报错。所以,在这个时候,最好的
处理
办法
就是将结果集
处理
成CLOB格式。
下面是自定义的行转列
函数
。
CREATE OR REPLACE TYPE zh_
concat
_im
AUTHID CURRENT_USER AS OBJECT
CURR_STR clob,
STATIC FUNC...
oracle
中listagg
字符
串拼接不能过长遇到的坑
有时候写程序遇到需要拼接的列表展示,然后就用了
oracle
中的listagg
listagg(id, ',')within group(order by id) as itemId;
这个只能说能满足数据量,拼接
字符
串不多的需求,如果遇到
字符
串过多的就拉闸了,解决
办法
:
xmlagg(xmlparse(content id||',' wellformed) order by id).getclobval() as id
用了之后呢,你会发现,他最后
oracle
wm
_
concat
(column)
函数
使我们经常会使用到的,下面就教您如何使用
oracle
wm
_
concat
(column)
函数
实现字段合并,如果您对
oracle
wm
_
concat
(column)
函数
使用方面感兴趣的话,不妨一看。shopping:—————————————–u_id goods num——————————————1 苹果 22 梨子 51 西瓜 4
场景:使用select
wm
_
concat
(xxxxx) from table 的时候 返回的
字符
串过长
解决方案 :使用to_clob 将
字符
串转成 clob类型,但是由于使用的前端框架不能解析clob类型的值
再将clob转化成String类型
List<Map> olists=oDao.queryOrgRoleInfo(qu...
DBMS_LOB.SUBSTR() 会将clob转为 varchar2,而varchar2是有
长度
限制的 为
4000
(存储过程里
Oracle
10g
最大
为
4000
,
Oracle
12 可达32767)。
当大字段
超过
4000
时就会报错。
解决方法:
对CLOB字段进行截取然后在进行拼接,截取的
长度
根据存储的是汉字和数据决定
长度
。
--第二位表示要截取的
字符
串的
长度
--第三位表示截取
字符
串的开始位置(注:等于0或1时,都是从第一位开始截取)
SELECT dbms_lob.substr('xxxxx',
在
Oracle
数据库中,
wm
_
concat
函数
用于将指定的列合并为一个
字符
串,并且将结果作为一个长
字符
大型对象(CLOB)返回。然而,
wm
_
concat
函数
并不是
Oracle
官方支持的
函数
,它是由
Oracle
内部使用的一个
函数
,所以在使用
wm
_
concat
函数
时需要注意以下几点:
1.
wm
_
concat
函数
只能在
Oracle
11g Release 2之前的版本中使用。在
Oracle
11g Release 2及更高版本中,
Oracle
已经提供了LISTAGG
函数
来实现类似的功能。
2.
wm
_
concat
函数
只能用于查询中,而不能用于INSERT、UPDATE或DELETE语句中。
3.
wm
_
concat
函数
的返回值类型为CLOB,因此需要使用TO_CHAR
函数
将其转换为VARCHAR2类型才能进行比较或其他操作。
以下是一个使用
wm
_
concat
函数
的示例:
SELECT deptno,
wm
_
concat
(ename) AS employees
FROM emp
GROUP BY deptno;
该查询将会返回每个部门的员工姓名列表,以逗号分隔,并且将结果作为CLOB类型的employees列返回。