当我运行以下查询:
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的价值?
其他的困难,我有是大多数串聚集的例子我已经看到显示了如何为在读值的例子。 在我的例子约我我第一次修改的值(即我正在聚集两列)。
您可以使用XML函数来做到这一点它会返回一个CLOB。 JDBC应该只是与罚款。
select tm.product_id,
rtrim(extract(xmlagg(xmlelement(e, tm.book_id || '(' || tm.score || '),')),
'/E/text()').getclobval(), ',')
from tl_product_match tm
where tm.book_id is not null
group by tm.product_id;
例如: http://sqlfiddle.com/#!4/083a2/1
为什么不使用嵌套表?
set echo on;
set display on;
set linesize 200;
drop table testA;
create table testA
(
col1 number,
col2 varchar2(50)
);
drop table testB;
create table testB
(
col1 number,
col2 varchar2(50)
);
create or replace type t_vchar_tab as table of varchar2(50);
insert into testA values (1,'A');
insert into testA values (2,'B');
insert into testB values (1,'X');
insert into testB values (1,'Y');
insert into testB values (1,'Z');
commit;
-- select all related testB.col2 values in a nested table for each testA.col1 value
select a.col1,
cast(multiset(select b.col2 from testB b where b.col1 = a.col1 order by b.col2) as t_vchar_tab) as testB_vals
from testA a;
-- test size > 4000
insert into testB
select 2 as col1, substr((object_name || object_type), 1, 50) as col2
from all_objects;
commit;
-- select all related testB.col2 values in a nested table for each testA.col1 value
select a.col1,
cast(multiset(select b.col2 from testB b where b.col1 = a.col1 order by b.col2) as t_vchar_tab) as testB_vals
from testA a;
我不是Java专家,但是这已经有一段时间,我敢肯定,Java可以拉出来的值的嵌套表。 而且,没有必要来标记上其他方面的一些分隔字符串。
我所看到的描述有替代例子在这里- http://www.oracle-base.com/articles/misc/string-aggregation-techniques.php但它们都需要使用的功能或程序。
不,他们没有。 向下滚动,你会看到,不需要PL / SQL几个选项。