Sql Oracle 11.1g-使用wm_concat()将列值与大字符串连接起来
在Oracle 11.1g中尝试连接列值时出现以下错误: ORA-06502:PL/SQL:数字或值错误:字符串缓冲区太大 小的 我首先看了看是否可以使用提供的一些解决方案,但没有成功 我的数据如下所示:Sql Oracle 11.1g-使用wm_concat()将列值与大字符串连接起来,sql,oracle,oracle11g,oracle-sqldeveloper,Sql,Oracle,Oracle11g,Oracle Sqldeveloper,在Oracle 11.1g中尝试连接列值时出现以下错误: ORA-06502:PL/SQL:数字或值错误:字符串缓冲区太大 小的 我首先看了看是否可以使用提供的一些解决方案,但没有成功 我的数据如下所示: 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 continuati
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非常生疏,所以我的排序被取消了,但自从我第一次陷入缓冲区问题以来,我就很难找到如何进行排序。我猜B.SEQ不在您查询的分组中,否则,根据您的数据,您将连接一行
因此,从测量结果字符串的长度开始:
SELECT A.PID, SUM(LENGTH(B.NOTE_FRAGMENT))
FROM A inner join
b
on A.PID = B.PID
group by A.PID
order by 3 DESC;
如果最大值超过4000,则无法将结果放入字符串中
顺便说一下,在Oracle11g中,我推荐Listag而不是wm_concat
编辑:
实际上,Oracle非常强大,因此您可以真正做您想做的事情:
SELECT A.PID,
listagg(CASE WHEN CLEN < 3500 THEN B.NOTE_FRAGMENT END), ' ') WITHIN GROUP (ORDER BY B.SEQ)
FROM (SELECT A.PID, B.SEQ,
SUM(LENGTH(B.NOTE_FRAGMENT) + 1) OVER (PARTITION BY A.PID ORDER BY B.SEQ) as CLEN
FROM A inner join
b
on A.PID = B.PID
) AB
GROUP BY A.PID
ORDER BY 3 DESC;
这会测量长度,并在连接过长之前停止连接。连接的字符串是否会超过4000字节?您使用未记录的wm_concat函数有什么原因吗?而不是使用,比如,你链接到的问题中的Listag分析函数?还是用户定义的聚合函数?我使用的是oracle 11.1,这就是我使用wm_concat的原因,我相信使用Listag的示例适用于11.2,因为我无法让它为我工作。我不确定连接的字符串是否会超过4000字节,但我认为这肯定是可能的。如果结果超过4000字节,则不能使用wm_concat,即使使用11.2,也不能使用listagg。你能创建一个自定义聚合函数并使用它吗?看起来我的很多结果都超过了4000。不太确定如何编写自定义聚合函数,所以我想我可能会编写一个程序,在导出到csv后将它们串在一起。@JustinCave您如何知道聚合操作允许的最大大小?它是否依赖于正在聚合的列类型?在本例中,我刚刚意识到它是varchar21500,还是来自Oracle文档中的最大值,其中varchar2是4000字节?尝试此查询后,我得到以下错误:ORA-00923:from关键字未找到预期的00923。00000-未找到FROM关键字预期的位置您知道这是否与所使用的Oracle版本有关吗?同样,我用的是11。1@sager89 . . . 查询中有几个输入错误。即使没有输入错误,它似乎也在“WITHIN”子句之后找到了错误。而且,看起来最大音符的长度是333750。。。还有其他超过4000张唱片。。。看来我得写个程序在Oracle之外把这些串起来…@sager89。古怪的逻辑应该只记录累计长度远小于4000个字符的笔记。对不起,我刚才说的是给出长度的sql查询。我试图运行实际返回连接注释的查询时出错。错误一直出现在INSERIN子句之后,表示FROM关键字未在预期位置找到