我正在使用 SYS_CONNECT_BY_PATH 进行字符串聚合。查询的一般形式是这样的:
select /*a bunch of fields unrelated to the problem*/,
--Use SYS_CONNECT_BY_PATH to glue together all the chunks of XML.
--The XSL header and footer are prepended and appended here.
, XMLType(to_clob('<?xml version="1.0"?><!-- begining of XSL file -->,'<!-- Next Section -->'))||'</xsl:stylesheet>')) AS XSL
from (
select /*a bunch of fields unrelated to the problem*/
case when x = 1 then to_clob('
/*a bunch of XSL*/
<xsl:text>'||subq.new_c_value||'</xsl:text>
/*a whole bunch more xsl*/')
else
to_clob('/*a bunch of different XSL*/
<xsl:text>'||subq.new_f_value||'</xsl:text>
/*a whole bunch more xsl*/')
end as xsl,
--curr and prev are to help with using sys_connect_by_path do string aggregation.
rownum AS curr,
rownum -1 AS prev
from (Select /* details of subq not relevant */ ) as subq
)
CONNECT BY prev = PRIOR curr
START WITH curr = 1;
基本上,我正在运行一个查询来生成用于更正 XML 文件的 XSL。我正在使用 sys_connect_by_path 将字符串组合成一个块,这比从多行复制和粘贴许多值更容易。我不能使用任何自定义字符串聚合函数,因为此查询在生产数据库上运行,我不能随心所欲地创建函数。
问题是运行我的查询将返回:
ORA-01489: 字符串连接的结果太长 01489. 00000 - “字符串连接的结果太长” *原因:字符串连接结果超过最大大小。 *行动:确保结果小于最大大小。
...在数据过多的情况下。如您所见,我一直在将该to_clob()
功能应用到我认为可能有帮助的任何地方,但似乎并没有太大的不同。除了使用 PL/SQL 之外,还有其他方法可以解决这个问题吗?我更愿意将其保留为查询,因为此查询的结果被导出到报告模板中,该模板与 XSL 并排显示了许多有用的信息。如果能够在一个步骤中完成所有这些操作,而不是几个步骤,那就太好了。
(甲骨文 10g)
最后,我找到了这个页面:
http://www.sqlsnippets.com/en/topic-11787.html
关于 Oracle 中的字符串聚合技术。我怀疑在我的情况下唯一可以使用的是 XML 方法和 Model 方法。我无法让模型方法正常工作,所以我只使用了 XML 方法。