参见英文答案 >
LISTAGG function: “result of string concatenation is too long”11个
创建一个视图,其中一个字段(6个)是源表中两个字段的串联.创建了第二个视图,该视图使用listagg可能组合串联的结果.使用此两步操作正确返回源表中两个字段的listagg并置.
创建一个视图,其中一个字段(6个)是源表中两个字段的串联.创建了第二个视图,该视图使用listagg可能组合串联的结果.使用此两步操作正确返回源表中两个字段的listagg并置.
当我尝试创建一个将产生串联和listagg的视图时,我得到oracle错误ora-01489字符串连接的结果太长.
作为测试,我选择了max(长度(连接字段)并且返回了837.因此,所显示的错误似乎是错误的.
所以它必须在语法中.我已经尝试过rtrim,trim甚至substr,但是无法获取view语句来编译listagg(连接)和返回数据.
我能够开发正确返回数据的两个视图表明我已经将基本语法降低了,但是将串联与listagg函数结合起来的任务我一直无法弄清楚.
在另外一种情况下,我能够在一个语句中将串联与listagg函数结合起来:
LISTAGG (STATEMENTS || ' - ' || BIRTH_DATE,'; ') WITHIN GROUP (ORDER BY STATEMENTS || ' - ' || BIRTH_DATE) AS GROWING_UP
此语法正确返回所需的数据………
但在上述情况下,类似的语法会产生Ora-01489错误.
知道有时Oracle错误可能会产生误导,我想知道是否有任何板载专家可能知道除了声明Oracle可能会抛出此错误之外的任何其他原因?
LISTAGG ((NUMBER || '-' || text),',') WITHIN GROUP (ORDER BY (NUMBER || '-' || text)) AS restrictions FROM source
返回错误
解决方法
您超过了4000字节的sql限制,也适用于LISTAGG.
sql> SELECT listagg(text,') WITHIN GROUP ( 2 ORDER BY NULL) 3 FROM 4 (SELECT to_char(to_date(level,'j'),'jsp') text FROM dual CONNECT BY LEVEL < 250 5 ) 6 / SELECT listagg(text,') WITHIN GROUP ( * ERROR at line 1: ORA-01489: result of string concatenation is too long
作为解决方法,您可以使用XMLAGG.
例如,
sql> SET LONG 2000000 sql> SET pagesize 50000 sql> SELECT rtrim(xmlagg(XMLELEMENT(e,text,').EXTRACT('//text()') 2 ).GetClobVal(),') very_long_text 3 FROM 4 (SELECT to_char(to_date(level,'jsp') text FROM dual CONNECT BY LEVEL < 250 5 ) 6 / VERY_LONG_TEXT -------------------------------------------------------------------------------- one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve,thirteen,fourteen,fifteen,sixteen,seventeen,eighteen,nineteen,twenty,twenty-one,twenty-two,twenty -three,twenty-four,twenty-five,twenty-six,twenty-seven,twenty-eight,twenty-nine,thirty,thirty-one,thirty-two,thirty-three,thirty-four,thirty-five,thirty-six,thi rty-seven,thirty-eight,thirty-nine,forty,forty-one,forty-two,forty-three,forty-f our,forty-five,forty-six,forty-seven,forty-eight,forty-nine,fifty,fifty-one,fift y-two,fifty-three,fifty-four,fifty-five,fifty-six,fifty-seven,fifty-eight,fifty- nine,sixty,sixty-one,sixty-two,sixty-three,sixty-four,sixty-five,sixty-six,sixty -seven,sixty-eight,sixty-nine,seventy,seventy-one,seventy-two,seventy-three,seve nty-four,seventy-five,seventy-six,seventy-seven,seventy-eight,seventy-nine,eight y,eighty-one,eighty-two,eighty-three,eighty-four,eighty-five,eighty-six,eighty-s even,eighty-eight,eighty-nine,ninety,ninety-one,ninety-two,ninety-three,ninety-f our,ninety-five,ninety-six,ninety-seven,ninety-eight,ninety-nine,one hundred,one hundred one,one hundred two,one hundred three,one hundred four,one hundred five,one hundred six,one hundred seven,one hundred eight,one hundred nine,one hundre d ten,one hundred eleven,one hundred twelve,one hundred thirteen,one hundred fou rteen,one hundred fifteen,one hundred sixteen,one hundred seventeen,one hundred eighteen,one hundred nineteen,one hundred twenty,one hundred twenty-one,one hund red twenty-two,one hundred twenty-three,one hundred twenty-four,one hundred twen ty-five,one hundred twenty-six,one hundred twenty-seven,one hundred twenty-eight,one hundred twenty-nine,one hundred thirty,one hundred thirty-one,one hundred t hirty-two,one hundred thirty-three,one hundred thirty-four,one hundred thirty-fi ve,one hundred thirty-six,one hundred thirty-seven,one hundred thirty-eight,one hundred thirty-nine,one hundred forty,one hundred forty-one,one hundred forty-tw o,one hundred forty-three,one hundred forty-four,one hundred forty-five,one hund red forty-six,one hundred forty-seven,one hundred forty-eight,one hundred forty- nine,one hundred fifty,one hundred fifty-one,one hundred fifty-two,one hundred f ifty-three,one hundred fifty-four,one hundred fifty-five,one hundred fifty-six,o ne hundred fifty-seven,one hundred fifty-eight,one hundred fifty-nine,one hundre d sixty,one hundred sixty-one,one hundred sixty-two,one hundred sixty-three,one hundred sixty-four,one hundred sixty-five,one hundred sixty-six,one hundred sixt y-seven,one hundred sixty-eight,one hundred sixty-nine,one hundred seventy,one h undred seventy-one,one hundred seventy-two,one hundred seventy-three,one hundred seventy-four,one hundred seventy-five,one hundred seventy-six,one hundred seven ty-seven,one hundred seventy-eight,one hundred seventy-nine,one hundred eighty,o ne hundred eighty-one,one hundred eighty-two,one hundred eighty-three,one hundre d eighty-four,one hundred eighty-five,one hundred eighty-six,one hundred eighty- seven,one hundred eighty-eight,one hundred eighty-nine,one hundred ninety,one hu ndred ninety-one,one hundred ninety-two,one hundred ninety-three,one hundred nin ety-four,one hundred ninety-five,one hundred ninety-six,one hundred ninety-seven,one hundred ninety-eight,one hundred ninety-nine,two hundred,two hundred one,tw o hundred two,two hundred three,two hundred four,two hundred five,two hundred si x,two hundred seven,two hundred eight,two hundred nine,two hundred ten,two hundr ed eleven,two hundred twelve,two hundred thirteen,two hundred fourteen,two hundr ed fifteen,two hundred sixteen,two hundred seventeen,two hundred eighteen,two hu ndred nineteen,two hundred twenty,two hundred twenty-one,two hundred twenty-two,two hundred twenty-three,two hundred twenty-four,two hundred twenty-five,two hun dred twenty-six,two hundred twenty-seven,two hundred twenty-eight,two hundred tw enty-nine,two hundred thirty,two hundred thirty-one,two hundred thirty-two,two h undred thirty-three,two hundred thirty-four,two hundred thirty-five,two hundred thirty-six,two hundred thirty-seven,two hundred thirty-eight,two hundred thirty- nine,two hundred forty,two hundred forty-one,two hundred forty-two,two hundred f orty-three,two hundred forty-four,two hundred forty-five,two hundred forty-six,t wo hundred forty-seven,two hundred forty-eight,two hundred forty-nine
如果要连接多个本身有4000个字节的列,则可以连接每列的XMLAGG输出以避免4000字节的sql限制.
例如,
WITH DATA AS ( SELECT 1 id,rpad('a1',4000,'*') col1,rpad('b1','*') col2 FROM dual UNION SELECT 2 id,rpad('a2',rpad('b2','*') col2 FROM dual ) SELECT ID,rtrim(xmlagg(XMLELEMENT(e,col1,').EXTRACT('//text()') ).GetClobVal(),') || rtrim(xmlagg(XMLELEMENT(e,col2,') AS very_long_text FROM DATA GROUP BY ID ORDER BY ID;