【发布时间】:2014-10-17 12:59:39
【问题描述】:
尝试在 Oracle 11.1g 中连接列值时出现以下错误:
ORA-06502:PL/SQL:数字或值错误:字符串缓冲区太 小
我首先查看了SQL Query to concatenate column values from multiple rows in Oracle,看看我是否可以使用提供的一些解决方案 - 但没有成功。
我的数据如下所示:
Table A
PID
A
B
C
Table B
PID SEQ NOTE_FRAGMENT
A 9999 This is the start of the note
A 9998 and this is a continuation of that note.
A 9997 Finally, this is the last part of the note for PID A.
B 9999 Note data for PID B.
C 9999 Yes
C 9998 we can
C 9997 do
C 9996 this work!
我的查询如下:
SELECT
A.PID,
B.SEQ,
wm_concat(B.NOTE_FRAGMENT)
FROM A
inner join b on A.PID = B.PID
group by A.PID, B.SEQ
order by B.SEQ
再次,我试图将给定 PID 的所有注释按从最大到最小的顺序组合。我也有一种预感,因为我对我的 SQL 很生疏,所以我的订单已经关闭,但是自从我第一次遇到缓冲区问题以来,我很难找到原因。
【问题讨论】:
-
连接的字符串会超过 4000 字节吗?您是否有理由使用未记录的
wm_concat函数?而不是使用您链接到的问题中的listagg分析函数?还是用户定义的聚合函数? -
我使用的是 oracle 11.1,这就是我使用 wm_concat 的原因,我相信使用 listagg 的示例适用于 11.2,因为我无法让它为我工作。我不确定连接的字符串是否可以超过 4000 字节,但我认为这肯定是可能的。
-
如果结果可以超过 4000 字节,则不能使用
wm_concat(即使您使用的是 11.2,也不能使用listagg)。你能创建一个自定义聚合函数并使用它吗? -
-
@JustinCave 你怎么知道聚合操作的最大允许大小?它是依赖于正在聚合的列类型(在这种情况下,我刚刚意识到它是 varchar2(1500))还是来自 Oracle 文档 docs.oracle.com/cd/B28359_01/server.111/b28320/… 中的最大值,它说 varchar2 是 4000 字节?
标签: sql oracle oracle11g oracle-sqldeveloper