10

我正在使用 Oracle 11g,并试图找出文本的长度。我通常使用select length(myvar) from table,但我不能这样做。

我要查询的表有一个BLOB保存字符或照片的列。我想知道我的BLOB专栏有多少个字符。

我尝试使用 将 myBLOB转换为 char UTL_RAW.CAST_TO_VARCHAR2(myblob) from table,但此功能无法正常工作,或者我犯了一个错误。

例如:我BLOB有这个词Section,当我在数据库中以十六进制形式看到这个时,我看到了S.e.c.t.i.o.n.。我不知道为什么每个字母之间都有这些点。然后我使用了这个查询:

select UTL_RAW.CAST_TO_VARCHAR2(myblob) 
from table

此查询的结果是'S',它不是 myBLOB拥有的完整单词,当我进行此查询时:

select length(UTL_RAW.CAST_TO_VARCHAR2(myblob))
from table

结果是18,但这个词Sections没有 18 个字符。

我试图将 转换BLOB为 a VARCHAR,尽管我认为我最好的选择是 aCLOB因为它可以保存的文本长度超过了限制VARCHAR。我试图通过进行此查询来做到这一点(我不确定这是否正确,但这是我在互联网上找到的):

select UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(myblob, 32767, 1))
from table

此查询还返回'S'

4

4 回答 4

20

对于任何来到这个线程并想知道如何将 blob 转换为 clob 的人。这是一个例子。

create function clobfromblob(p_blob blob) return clob is
      l_clob         clob;
      l_dest_offsset integer := 1;
      l_src_offsset  integer := 1;
      l_lang_context integer := dbms_lob.default_lang_ctx;
      l_warning      integer;

   begin

      if p_blob is null then
         return null;
      end if;

      dbms_lob.createTemporary(lob_loc => l_clob
                              ,cache   => false);

      dbms_lob.converttoclob(dest_lob     => l_clob
                            ,src_blob     => p_blob
                            ,amount       => dbms_lob.lobmaxsize
                            ,dest_offset  => l_dest_offsset
                            ,src_offset   => l_src_offsset
                            ,blob_csid    => dbms_lob.default_csid
                            ,lang_context => l_lang_context
                            ,warning      => l_warning);

      return l_clob;

   end;
于 2012-10-12T07:31:43.940 回答
5

要将 blob 转换为 clob,请尝试以下操作:

SELECT TO_CLOB(UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(MYBLOB,2000))) 
FROM MYTABLE;
于 2017-07-13T22:33:43.347 回答
4
SELECT DBMS_LOB.GetLength( myblob ) length_in_bytes
  FROM table

将以字节为单位返回 BLOB 的长度。听起来您的 BLOB 中的字符数据可能是使用 UTF-16 字符集编码的,因此字节数可能是字符数的两倍(取决于正在使用的 Unicode 版本和存储的特定数据,一些字符可能需要 4 个字节的存储空间,但您处理这些字符的可能性相对较小)。

您可以使用该DBMS_LOB.ConvertToClob过程将 BLOB 转换为 CLOB(尽管这是一个过程,您需要在 PL/SQL 块中调用它)。作为该转换的一部分,您几乎肯定需要指定编码数据的字符集——我的假设是您的应用程序使用的是 UTF-16 字符集,但这只是一个假设。

于 2012-10-11T23:36:52.750 回答
2

仅转换为 CLOB:

select TO_CLOB(UTL_RAW.CAST_TO_VARCHAR2(YOURCLOB)) from DUAL;

受到克雷格的启发,不受尺寸限制。

于 2019-04-24T09:12:09.207 回答