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()
。