如何将BLOB转换为CLOB?

2022-03-03 00:00:00 blob oracle clob

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

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

我尝试使用UTL_RAW.CAST_TO_VARCHAR2(myblob) from tableBLOB转换为字符,但此函数无法正常工作,或者我可能出错。

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

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'


解决方案

对于任何来到此线程并想知道如何将斑点转换为块的人。这里有一个示例。

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;

相关文章