将blob转换为clob

时间:2012-10-11 21:45:54

标签: oracle blob clob

我正在使用oracle 11g而我正试图找出文本的长度。我通常会从表中使用select length(myvar),但我不能这样做。

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

我尝试使用表中的UTL_RAW.CAST_TO_VARCHAR2(myblob)将我的BLOB转换为char,但是这个函数无法正常工作或者我犯了错误。

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

select UTL_RAW.CAST_TO_VARCHAR2(myblob) 
from table

此查询的结果是'S',因此它不是我的BLOB所具有的完整单词,以及当我进行此查询时

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

结果为18,而Sections一词没有18个字符。

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

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

此查询还返回'S'

我希望你能帮我解决这个问题。感谢先进的

4 个答案:

答案 0 :(得分:13)

对于任何人来到此主题并想知道如何将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;

答案 1 :(得分:2)

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字符集,但这只是一个假设。

答案 2 :(得分:1)

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

SELECT TO_CLOB(UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(MYBLOB,2000))) 
FROM MYTABLE;

答案 3 :(得分:0)

仅转换为CLOB:

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

受Craig的启发,不受大小限制。