Ошибка при вызове RTRIM после XMLAGG: ORA-19011: Character string buffer too small
Есть следующий запрос:
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
Этот запрос работает, если относительно небольшое количество записей объединяются функцией XMLAGG. Но если колличество таких записей будет больше, то возникает следующая ошибка:
ORA-19011: Character string buffer too small
Что надо изменить, чтобы запрос заработал?
Свободный перевод XMLAGG with RTRIM issue от участника @Soham Shah
Ответы (1 шт):
Надо добавить .getClobVal() к результату с типом данных XMLType до вызова RTRIM.
XMLAGG отлично справляется с большим колличеством данных. TRIM тоже может работать с CLOB. Но если соединить эти функции вместе, то XMLType будет неявно конвертирован в VARCHAR2, а не в CLOB.
Например:
create or replace function testfun return clob is
c clob;
begin
c := c||lpad ('a', 4000, 'a');
c := c||lpad ('b', 4000, 'b');
return c;
end;
/
--работает, вернёт XMLType
select xmlagg (xmlelement("abc", testfun)) from dual;
--работает, вернёт CLOB
select trim (testfun) from dual;
--ORA-19011: Character string buffer too small
select trim (xmlagg (xmlelement ("abc", testfun))) from dual;
--работает
select trim (xmlagg (xmlelement ("abc", testfun)).getClobVal()) from dual;
Свободный перевод ответа от участника @Jon Heller