0

我用 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 检索?

4

1 回答 1

0

substr 正在返回具有一定字节数的字符串

Oracle 文档说 SUBSTR 函数的数量参数表示要为 CLOB 读取的字符数(不是字节数)。

它不仅适用于长度,因为那样我会遇到像 à é oder è 这样的多字节字符的问题

尝试使用“ Unicode=true; ”连接字符串参数。

上面的查询适用于大多数行,但对于其中一些行,它仍然会引发 ORA-06502。但是,如果我将限制更改为 3992,它总是有效???

向我们发送一个小型测试项目,以便我们可以在我们的环境中重现该问题。还要说明:

  • 您的连接字符串(大致,没有凭据)
  • 对应数据库对象的 DDL/DML 脚本
  • Oracle 服务器的版本、NLS_LANGUAGE、NLS_CHARACTERSET 和 NLS_NCHAR_CHARACTERSET 参数
于 2013-10-31T15:25:46.263 回答