2012-10-11 99 views
4

我正在使用oracle 11g,并试图找出文本的长度。我通常会使用表中的select长度(myvar),但我不能那样做。将blob转换为clob

我想要查询的表格有一个保存字符或照片的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和单词部分没有18个字符。

我试图将blob转换为varchar,尽管我认为我最好的选择是clob,因为它可以保存的文本的长度超过了varchar的限制。我试图做的是通过使这个查询(我不知道这是否是正确的,但是我在互联网上找到)

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

此查询还返回“S”

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

+0

DBMS_LOB.GET_LENGTH()可以帮助 – cagcowboy

+1

欢迎变长字符编码的精彩世界 – climbage

+0

@cagcowboy我使用select DBMS_LOB.GET_LENGTH尝试(myblob)从表中,但我得到一个错误。 ORA-00904无效标识符。 – user1739469

回答

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

+0

对不起的投票,它发生的意外,不会让我投票,直到编辑。 –

10

对于任何人来这个线程,并想知道如何将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

两件事: 1.您需要创建一个临时CLOB 2。如果p_blob为空,则应该将空值短路。 'begin if p_blob is null then return null; end if; DBMS_LOB.CREATETEMPORARY(l_clob,false); dbms_lob.converttoclob(...' (编辑格式) –

-1

成团块转换为CLOB,试试这个:

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

什么是编辑?你没有改变任何东西。 – Craig