使用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(根据您的使用情况,可以生成XMLElement,XMLForest,SYS_XMLGen,DBMS_XMLQuery等)。使用这些内置函数在架构上会好得多。