2009-05-06 70 views
85

我试图从SQL控制台什么是Oracle BLOB里面看到。我如何得到BLOB文本内容的Oracle SQL

我知道它包含一个有点大段文字,我只想看文字,但下面的查询只表示有在该领域中的BLOB:

select BLOB_FIELD from TABLE_WITH_BLOB where ID = '<row id>'; 

结果我得到的是不太我所期待的:

 
    BLOB_FIELD 
    ----------------------- 
    [email protected] 

所以我可以做什么样的魔法咒语打开BLOB到它的文字表述?

PS:我只是想看看BLOB的从SQL控制台(Eclipse数据工具)的内容,在代码中使用它。

回答

104

首先,你可能要存储在CLOB/NCLOB列,而不是BLOB,这是专为二进制数据(查询将与CLOB工作,顺便说一句)文本。

以下查询将让您看到blob中文本的前32767个字符(最多),前提是所有字符集都是兼容的(存储在BLOB中的原始CS文本,用于数据库的CS VARCHAR2):

select utl_raw.cast_to_varchar2(dbms_lob.substr(BLOB_FIELD)) from TABLE_WITH_BLOB where ID = '<row id>'; 
+3

不幸的是,我不控制数据库架构 - 我只需要无论如何不期而遇的斑点...... 但感谢。 – 2009-05-07 06:32:28

+0

谢谢你的Mac,工作正常 - 但什么是“dbms_lob.substr”的目的是什么? ---只使用“select utl_raw.cast_to_varchar2(BLOB_FIELD)...”似乎给了我相同的结果......? – Rop 2013-08-18 19:18:22

+4

cast_to_varchar2取入输入(http://docs.oracle.com/cd/E11882_01/appdev.112/e25788/u_raw.htm#autoId18),它被限制为在长度32767个字节(HTTP一个RAW://文档。 oracle.com/cd/E11882_01/appdev.112/e10472/datatypes.htm#autoId8)。甲BLOB在大小没有限制,因此,如果必要SUBSTR它截断到正确大小(http://docs.oracle.com/cd/E11882_01/appdev.112/e25788/d_lob.htm#autoId57)。 – Mac 2013-08-19 06:01:31

-4

使用TO_CHAR函数。

select TO_CHAR(BLOB_FIELD) from TABLE_WITH_BLOB where ID = '<row id>' 

NCHARNVARCHAR2CLOB,或NCLOB数据转换为数据库的字符集。返回的值始终为VARCHAR2

5

如果你想里面的文字进行搜索,而不是浏览它,这个工程:

with unzipped_text as (
    select 
    my_id 
    ,utl_compress.lz_uncompress(my_compressed_blob) as my_blob 
    from my_table 
    where my_id='MY_ID' 
) 
select * from unzipped_text 
where dbms_lob.instr(my_blob, utl_raw.cast_to_raw('MY_SEARCH_STRING'))>0; 
1

巴恩的回答为我工作与修改,因为我的列不被压缩。快速和肮脏的解决方案:

select * from my_table 
where dbms_lob.instr(my_UNcompressed_blob, utl_raw.cast_to_raw('MY_SEARCH_STRING'))>0; 
2

我这个挣扎了一会儿,实现PL/SQL解决方案,但后来意识到,在蟾蜍你可以在结果网格单元只需双击,它带来了一个编辑器与文本中的内容。 (我是蟾蜍V11)

enter image description here

10

您可以使用以下SQL从表中读取BLOB字段。

SELECT DBMS_LOB.SUBSTR(BLOB_FIELD_NAME) FROM TABLE_NAME;