Oracle 带有RTRIM问题的XMLAGG

Oracle 带有RTRIM问题的XMLAGG,oracle,xquery,xmltable,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 COLUMN

目前我有以下疑问:

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
如果有少量XML行要与XML AGG合并成单行,则此查询工作正常。但如果要合并的XML行数较高,则此查询将引发以下错误:

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


我需要应用什么更改才能使其生效?

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

XMLAGG可以很好地处理大量数据。和修剪工程罚款CLOBs。但是当您将它们放在一起时,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;

您需要添加
getClobVal()
,还需要添加
rtrim()
,因为它将在结果末尾返回分隔符

SELECT RTRIM(XMLAGG(XMLELEMENT(E,colname,',').EXTRACT('//text()') ORDER BY colname).GetClobVal(),',')
  FROM tablename;

我正在尝试以下查询:选择xmlement(“行集”,XMLAGG(RW.R ORDER BY RW.“ID”).getClobVal(),“”)作为来自TMTABLE UL的订单,XMLTABLE('Rowsets/Rowset/Row'传递UL.TEXT列“ID”编号(19)路径'ID',R xmltype PATH'.')作为RW,但它给了我以下错误:ORA-00932:不一致的数据类型:应为-getCHAR@SohamShah我认为您需要将
.getClobVal()
放在最后一个XML函数之后,而不仅仅是最后一个XMLAGG。尝试:
xmlement(“行集”,XMLAGG(RW.R按RW.ID排序),“”).getClobVal()