使用CLOB而不是VARCHAR2

时间:2016-05-31 17:09:35

标签: plsql oracle11g clob varchar2

我们想要创建一个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的工作吗?

1 个答案:

答案 0 :(得分:4)

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

然而,以这种方式构建XML将是一个非常糟糕的架构。例如,当其中一个字符串碰巧有一个需要转义的字符时(或由于多种不同的原因),这种架构很有可能产生无效的XML。 Oracle提供了许多函数来生成XML(XMLElementXMLForestSYS_XMLGenDBMS_XMLQuery等,具体取决于您的用例)。在架构上使用这些内置函数会好得多。