使用 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,等等,具体取决于您的用例)。使用这些内置函数在架构上会好得多。
我们想创建一个 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,等等,具体取决于您的用例)。使用这些内置函数在架构上会好得多。