如何将BLOB转换为CLOB?
我使用的是Oracle 11g,我正在尝试找出文本的长度。我通常使用select length(myvar) from table
,但我不能那样做。
BLOB
列,用于保存字符或照片。我想知道我的BLOB
列有多少个字符。
我尝试使用UTL_RAW.CAST_TO_VARCHAR2(myblob) from table
将BLOB
转换为字符,但此函数无法正常工作,或者我可能出错。
例如:
我的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;
相关文章