【问题标题】:ORA-06502 with varchar2 conversion from clobORA-06502 用 varchar2 从 clob 转换
【发布时间】:2013-11-07 13:01:45
【问题描述】:

我对 clob 和 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 检索?

【问题讨论】:

    标签: oracle clob varchar2 ora-06502


    【解决方案1】:

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

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

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

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

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

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

    • 您的连接字符串(大致上,没有凭据)
    • 对应数据库对象的 DDL/DML 脚本
    • Oracle 服务器的版本、NLS_LANGUAGE、NLS_CHARACTERSET 和 NLS_NCHAR_CHARACTERSET 参数

    【讨论】:

      猜你喜欢
      • 2015-10-21
      • 2011-02-11
      • 1970-01-01
      • 2014-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多