我使用的是Oracle 12.1。我有一个ID列,我正在使用group by,并希望将另一列(比如NAME)中的值转换为逗号分隔的字符串作为CLOB(而不是VARCHAR 2,因为它限制为4000个字符)。
我尝试使用LISTAGG函数,但失败了,因为逗号分隔的字符串超过4000个字符。(有一个改进版本的LISTAGG来限制溢出,但在Oracle 12.1中不可用)
使用XMLAGG,它可以工作,但我不想使用XMLAGG,因为这个特殊的函数每5秒调用一次,有时会产生性能问题,偶尔也会出现“ORA-04036:示例使用的PGA内存超过PGA_AGGREGATE_LIMIT”
我想要的是-
1.或者需要一种方法将列值转换为逗号分隔的字符串作为CLOB(不使用LISTAGG,XMLAGG)
或
1.我可以跳过一些列的值,并使用“...”来通知有更多的值。(假设我们可以只考虑5行,而不是给定ID的所有行(按列分组))
感谢您的评分
2条答案
按热度按时间ftf50wuq1#
在my answer here中,您可以编写一个自定义聚合函数来将
VARCHAR2
聚合为CLOB
:然后您可以执行以下操作:
或
我可以跳过一些列的值,并使用“...”来通知有更多的值。(假设我们可以只考虑5行,而不是给定ID的所有行(按列分组))
fcipmucu2#
这里的答案不适合我的情况,因为我需要将其限制为单个SELECT查询,而不依赖于在数据库中创建的其他对象。
很多人建议使用XMLAGG来绕过4000个字符的限制。这确实有效,但问题是某些特殊字符会被XMLAGG“转义”,例如,〈变成
<
,&变成&
等。我在这里找到了解决这个问题的方法:https://forums.oracle.com/ords/apexds/post/xmlagg-apostrophe-and-quotes-issue-2107
如果使用XMLCAST Package XMLAGG,并将其强制转换为CLOB,则所有这些编码都是“未转义的”。
我发布这篇文章是为了更大的利益,以防有人(像我一样)沿着这里遇到我的限制,即不创建额外的对象来解决问题。