我用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检索?
答案 0 :(得分:0)
substr返回一个具有一定字节数的字符串
Oracle documentation表示SUBSTR函数的amount参数表示要为CLOB读取的字符数(不是字节数)。
它只能用于长度,因为我遇到像àéderè
这样的多字节字符的问题
尝试使用“Unicode=true;”连接字符串参数。
上面的查询适用于大多数行,但对于其中一些行,它仍会抛出一个 ORA-06502。但是,如果我将限制更改为3992,它总是有效???
请send us一个小型测试项目,以便我们可以在我们的环境中重现该问题。同时指定: