Sql Oracle 11.1g-使用wm_concat()将列值与大字符串连接起来

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

在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 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关键字未在预期位置找到