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)