我们想要创建一个XML。当前代码通过一次将一个XML标记附加到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
的工作吗?
答案 0 :(得分:4)
是的,如果您将xmlString
的数据类型更改为clob
,字符串连接运算符将继续有效。
然而,以这种方式构建XML将是一个非常糟糕的架构。例如,当其中一个字符串碰巧有一个需要转义的字符时(或由于多种不同的原因),这种架构很有可能产生无效的XML。 Oracle提供了许多函数来生成XML(XMLElement,XMLForest,SYS_XMLGen,DBMS_XMLQuery等,具体取决于您的用例)。在架构上使用这些内置函数会好得多。