Буфер символьной строки xmltype слишком мал

В моей хранимой процедуре:

 declare
v_xml xmltype;
begin
open v_cur for
Select xmlelement('el',xmlagg(xmlelement('el2'))) from table;
loop
fetch v_cur into v_xml; -- line where the error 

*.....additional logic to parse v_xml*
end loop;
end;

Я получаю сообщение об ошибке «Слишком маленький буфер символьной строки», когда запись, которую нужно извлечь в v_xml, имеет длину> 4000. Ребята, у вас есть идеи, как это сделать? Спасибо


person Capital_East    schedule 12.04.2014    source источник
comment
Разве это не должно быть be xmlelement("el2") и подобным для "el"? Сколько строк у вас в таблице?   -  person Yavor    schedule 12.04.2014


Ответы (2)


Если вы используете xmlagg(), вам придется добавить .getclobval() к окружающему xmlelement(), так как ограничение на количество символов в xmlagg() составляет 4000. Очевидно, это означает, что вы будете использовать clobs вместо xmltype, но у вас нет выбора, вам придется вернуться к xmltype позже, если это необходимо. Пример ниже:

declare
v_xml clob; -- Use CLOB
begin
open v_cur for
Select xmlelement("el",xmlagg(xmlelement("el2", tab_col))).getclobval() from table; -- add .getclobval()
loop
fetch v_cur into v_xml; -- line where the error 

*.....additional logic to parse v_xml*
end loop;
end;
person Charles Henry    schedule 23.12.2014

Может быть, вы используете старую версию Oracle? В прошлом были некоторые ограничения. Для меня это работает с 10 000 000 строк:

declare
    v_xml xmltype;
begin
    select xmlelement("el", xmlagg(xmlelement("el2")))
    into v_xml from (select 1 from dual connect by level <= 10000000);
end;
person Yavor    schedule 12.04.2014