使用 CLOB 而不是 VARCHAR2

Using CLOB instead of 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 的工作吗?

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

但是,以这种方式构建 XML 将是一个非常糟糕的架构。这是一种很有可能生成无效 XML 的体系结构,例如,当其中一个字符串恰好具有需要转义的字符(或出于多种不同原因中的任何一个)时。 Oracle 提供了大量函数来生成 XML(XMLElement, XMLForest, SYS_XMLGen, DBMS_XMLQuery,等等,具体取决于您的用例)。使用这些内置函数在架构上会好得多。