当我运行以下查询时:
Select
tm.product_id,
listagg(tm.book_id || '(' || tm.score || ')',',')
within group (order by tm.product_id) as matches
from
tl_product_match tm
where
tm.book_id is not null
group by
tm.product_id
Oracle返回以下错误:
ORA-01489: result of string concatenation is too long
我知道它失败的原因是listagg函数试图连接大于4000个字符的值,这是不支持的。
我已经看到了这里描述的替代示例-http://www.oracle-base.com/articles/misc/string-aggregation-techniques.php,但它们都需要使用函数或过程。
有没有一种解决方案是纯SQL,而不必调用函数或存储过程,并且能够使用标准JDBC读取值?
我遇到的另一个困难是,我见过的大多数字符串聚合示例都显示了如何按原样读取值的示例。在我的例子中,我首先修改了值(即我正在聚合两列)。
4条答案
按热度按时间1u4esq0p1#
如果你只需要前4,000个字符,
LISTAGG
函数从版本12.2开始就有一个选项,可以轻松地截断溢出的数据,添加一个elipsis,然后添加截断值的数量。mw3dktmi2#
你可以使用xml函数来完成它,它返回一个CLOB。JDBC应该很好。
例如:http://sqlfiddle.com/#!4/083a2/1
wfauudbj3#
为什么不使用嵌套表?
我不是javaMaven,但这已经有一段时间了,我相信java可以从嵌套表中提取值。而且,不需要在另一端标记一些分隔字符串。
afdcj2ne4#
我已经看到了这里描述的替代示例-http://www.oracle-base.com/articles/misc/string-aggregation-techniques.php,但它们都需要使用函数或过程。
不,他们没有。向下滚动,你会看到几个不需要pl/sql的选项。