带有RTRIM问题的XMLAGG

Soh*_*hah 7 oracle xquery xmltable

目前我有以下查询:

SELECT 
    CASE 
       WHEN ('[Param.3]' = 'SELECTED')
          THEN (SELECT RTRIM(XMLELEMENT("Rowset", XMLAGG(RW.R ORDER BY RW."ID")), ' ' ) AS Orders
                FROM TMTABLE UL, XMLTABLE('Rowsets/Rowset/Row' PASSING UL.TEXT COLUMNS "ID" NUMBER(19) PATH 'ID', R xmltype path '.') AS RW
                WHERE ID BETWEEN '[Param.1]' and '[Param.2]')
       WHEN ('[Param.3]' = 'ALL' )
          THEN (SELECT RTRIM(XMLELEMENT("Rowset", XMLAGG(RW.R ORDER BY RW."ID")) , ' ' ) AS Orders
                FROM TMTABLE UL, XMLTABLE('Rowsets/Rowset/Row' PASSING UL.TEXT COLUMNS "ID" NUMBER(19) PATH 'ID', R xmltype path '.') AS RW)
    END AS Orders
FROM 
    dual
Run Code Online (Sandbox Code Playgroud)

如果要使用XML AGG将少量XML行合并到单行中,则此查询正常工作.但是,如果要合并的XML行数较高,则此查询会抛出以下错误:

ORA-19011:字符串缓冲区太小

我需要做哪些更改才能使其工作?

Jon*_*ler 15

您需要.getClobVal()在RTRIM之前添加XMLType结果.

XMLAGG可以很好地处理大量数据.并且TRIM适用于CLOB.但是当你把它们组合在一起时,Oracle会尝试将XMLType转换为VARCHAR2而不是CLOB.

例:

create or replace function test_function return clob is
    v_clob clob;
begin
    v_clob := v_clob || lpad('a', 4000, 'a');
    v_clob := v_clob || lpad('b', 4000, 'b');
    return v_clob;
end;
/

--Works fine, returns an XMLType
select xmlagg(xmlelement("asdf", test_function)) from dual;

--Works fine, returns a CLOB
select trim(test_function) from dual;

--ORA-19011: Character string buffer too small
select trim(xmlagg(xmlelement("asdf", test_function))) from dual;

--Works
select trim(xmlagg(xmlelement("asdf", test_function)).getClobVal()) from dual;
Run Code Online (Sandbox Code Playgroud)