ORA-01489:使用json进行字符串连接的结果太长

时间:2017-07-18 18:03:01

标签: sql json oracle

我有查询将获取JSON字符串中的输出,当我用一个值查询它时它工作正常。

但是当我查询所有字段时抛出错误。

  

ORA-01489:字符串连接的结果太长

我的查询有什么问题?

查询:

with ABC_ELEMETNS as
(
select '{'
 ||' "id":"'||A.PR||'"'
 ||' "de":"'||A.AA||'"'
 ||' "r":"'||A.BB||'"'
 ||' "r":"'||A.CC||'"'
 ||' "y":"'||A.DD||'"'
 ||'} ' json
from A
left join B on A.EE = B.EE
where A.EE = 12345
)
select '{"ELEMENTS":['
  ||(select listagg(json, ',')
             within group (order by 1)  
     from ABC_ELEMENTS)
  ||']}'
from DUAL;

2 个答案:

答案 0 :(得分:0)

Oracle中的

LISTAGG函数限制为4000字节。

您可以使用XMLAGGXMLELEMENT代替LISTAGG。

此链接非常有用:

https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions215.htm

答案 1 :(得分:0)

LISTAGG无法正常工作,如果字符串长度> 4000.

未经测试,但应该有效

with ABC_ELEMENTS as
(
select '{'
 ||' "id":"'||A.PR||'"'
 ||' "de":"'||A.AA||'"'
 ||' "r":"'||A.BB||'"'
 ||' "r":"'||A.CC||'"'
 ||' "y":"'||A.DD||'"'
 ||'} ' json
from A
left join B on A.EE = B.EE
where A.EE = 12345
)
select '{"ELEMENTS":['
  ||
RTRIM (
     XMLAGG (XMLELEMENT (E, json, ',').EXTRACT (
                '//text()') ORDER BY 1).GetClobVal (),
     ',')
  ||']}'
from ABC_ELEMENTS;