我正在使用oracle 11g,我正试图找出文本的长度.我通常会从表中使用select length(myvar),但我不能这样做.
我想查询的表有一个保存字符或照片的BLOB列.我想知道有BLOB列的字符数.
我尝试使用表中的UTL_RAW.CAST_TO_VARCHAR2(myblob)将我的BLOB转换为char,但是这个函数无法正常工作或者我犯了一个错误.
例如:我的BLOB有单词Section,当我在数据库中以十六进制形式看到这个时,我看到Section.我不知道为什么每个字母之间都有这些点.然后我使用了这个查询
select UTL_RAW.CAST_TO_VARCHAR2(myblob)
from table
Run Code Online (Sandbox Code Playgroud)
这个查询的结果是'S',所以它不是我的BLOB所拥有的完整单词,也不是我进行此查询时的完整单词
select length(UTL_RAW.CAST_TO_VARCHAR2(myblob))
from table
Run Code Online (Sandbox Code Playgroud)
结果是18,单词Sections没有18个字符.
我试图将blob转换为varchar,虽然我认为我最好的选择是clob,因为它可以保存的文本长度超过varchar的限制.我尝试通过进行此查询来做到这一点(我不确定这是否正确,但我是在互联网上找到的)
select UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(myblob, 32767, 1))
from table
Run Code Online (Sandbox Code Playgroud)
此查询还返回'S'
我希望你能帮我解决这个问题.谢谢你的进步
Ren*_*ene 14
对于任何人来到这个线程,并想知道如何将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;
Run Code Online (Sandbox Code Playgroud)
小智 5
要将 blob 转换为 clob,请尝试以下操作:
SELECT TO_CLOB(UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(MYBLOB,2000)))
FROM MYTABLE;
Run Code Online (Sandbox Code Playgroud)
SELECT DBMS_LOB.GetLength( myblob ) length_in_bytes
FROM table
Run Code Online (Sandbox Code Playgroud)
将返回 BLOB 的长度(以字节为单位)。听起来 BLOB 中的字符数据可能是使用 UTF-16 字符集编码的,因此字节数可能是字符数的两倍(取决于正在使用的 Unicode 版本和存储的特定数据,有些字符可能需要 4 个字节的存储空间,但您处理这些字符的可能性相对较小)。
您可以使用该DBMS_LOB.ConvertToClob过程将 BLOB 转换为 CLOB(尽管由于这是一个过程,因此您需要在 PL/SQL 块中调用它)。作为该转换的一部分,您几乎肯定需要指定数据编码所用的字符集——我的假设是您的应用程序正在使用 UTF-16 字符集,但这只是一个假设。
| 归档时间: |
|
| 查看次数: |
38969 次 |
| 最近记录: |