2014-04-12 199 views
2

在我的存儲過程:的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你大家有什麼想法如何去做這件事?謝謝

+0

不應該是xmlelement(「el2」)'和類似的「el」嗎?你的桌子上有多少行? – Yavor

回答

0

也許你正在使用舊的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; 
2

如果使用xmlagg(),你就必須添加.getclobval()到周圍xmlelement()由於焦炭極限是4000上xmlagg()。顯然這意味着你將使用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;