使用CLOB代替VARCHAR2

问题描述:

我们想要创建一个XML。当前代码通过将一个XML标签一次追加到VARCHAR2变量中来实现。使用CLOB代替VARCHAR2

xmlString     VARCHAR2(32767); 
.... 
.... 
xmlString := xmlString || '<' || elementName || '>' || elementValue || '</' || elementName || '>'; 

但是由于对VARCHAR2的32767个字符的大小限制,我们得到以下错误了很长的XML。

ORA-06502: PL/SQL: numeric or value error: character string buffer too small 

我们有解决的办法是宣布CLOB,写一个程序,以保持VARCHAR2变量清空至CLOB

v_result     clob; 
..... 
..... 
IF xmlString IS NOT NULL THEN 
     dbms_lob.writeappend(v_result, LENGTH(xmlString), xmlString); 
     xmlString := NULL; 
END IF; 

但是,这需要用新函数调用来替换大量现有的代码行。有一个更好的方法吗?

PLSQL中的运算符重载类似吗?我可以将xmlString变量的数据类型更改为CLOB并使||运算符执行dbms_lob.writeappend的工作吗?

是的,如果将数据类型xmlString更改为clob,则字符串连接运算符将继续工作。

但是,以这种方式构建XML将是一个非常糟糕的体系结构。例如,当某个字符串碰巧有一个字符需要转义(或出于多种不同原因)时,这种架构很可能会生成无效的XML。 Oracle提供了大量功能来生成XML(根据您的使用情况,可以生成XMLElementXMLForestSYS_XMLGenDBMS_XMLQuery等)。使用这些内置函数在架构上会好得多。