ORA-06502从clob转换varchar2

时间:2013-10-28 16:30:59

标签: oracle clob varchar2 ora-06502

我用clobs和varchar2进行了一些实验。问题是我们在数据库表中有很多XML,我想尽快下载XML。由于我需要使用C#DevArt组件,我尝试了各种方法,并发现clobs(它们涉及每行往返数据库)比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))

该查询基于假设长度返回clobs的字符数,substr返回具有一定字节数的字符串。它只能用于长度,因为我遇到了像àéderè这样的多字节字符的问题。但现在我有另一种非常奇怪的行为。上面的查询适用于大多数行,但对于其中一些行,它仍会抛出ORA-06502。但如果我将限制更改为3992它总是有效??? (作为信息,我们还将图片的缩略图存储为xml中的Base64编码字符串。)

现在有人为什么查询在所有情况下都不起作用。或者是否有人建议如何编写一个查询,以确定clob是否可以作为varchar2检索?

1 个答案:

答案 0 :(得分:0)

  

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

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

  

它只能用于长度,因为我遇到像àéderè

这样的多字节字符的问题

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

  

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

send us一个小型测试项目,以便我们可以在我们的环境中重现该问题。同时指定:

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