我用 clobs 和 varchar2 做了一些实验。问题是我们在数据库表中有很多 XML,我想尽快下载 XML。由于我需要使用 C# DevArt 组件,我尝试了各种方法,发现 clob(它们涉及每行到数据库的一次往返)比 varchar2 慢得多。
因此,我现在分两步下载数据。首先尽可能多地使用 varchar2(4000 字节限制),然后将其他所有内容作为 clob。
现在是棘手的部分。我想出了以下查询来找出我可以检索为 varchar2 的内容:
select c.xml.getstringval() from customers c where
length(t.xml.getclobval()) = length(dbms_lob.substr(c.xml.getclobval(), 4000, 1))
该查询基于这样的假设,即 length 返回 clob 的字符数,而 substr 返回具有一定字节数的字符串。它不仅适用于长度,因为那样我会遇到像 à é oder è 这样的多字节字符的麻烦。但现在我有另一个非常奇怪的行为。上面的查询适用于大多数行,但对于其中一些行,它仍然会引发 ORA-06502。但是,如果我将限制更改为 3992,它总是有效???(作为信息,我们还将图片的缩略图存储为 xml 中的 Base64 编码字符串)。
现在有谁知道为什么查询在所有情况下都不起作用。或者有没有人建议如何编写一个查询来确定是否可以将 clob 作为 varchar2 检索?