如何从Oracle SQL中的BLOB获取文本内容

我正试图从SQL控制台中看到Oracle BLOB中的内容。

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

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

我得到的结果是不是我所期望的:

     BLOB_FIELD
     -----------------------
     oracle.sql.BLOB@1c4ada9

那么我能做些什么样的魔法咒语来把BLOB变成文本表示呢?

PS:我只是想从SQL控制台(Eclipse Data Tools)中查看BLOB的内容,而不是在代码中使用它。

首先,您可能希望将文本存储在CLOB / NCLOB列中,而不是用于二进制数据的BLOB(顺便说一下,您的查询将与CLOB一起使用)。

如果所有字符集都兼容(BLOB中存储的文本的原始CS,用于VARCHAR2的数据库的CS),则可以使用以下查询来查看blob中文本的前32767个字符(最多):

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

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

 SELECT DBMS_LOB.SUBSTR(BLOB_FIELD_NAME) FROM TABLE_NAME; 

如果你想在文本内search,而不是查看它,这个工作:

 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; 

我为此苦苦挣扎了一段时间,并且实现了PL / SQL解决scheme,但后来才意识到,在Toad中,只需双击结果网格单元格,就可以打开一个带有文本内容的编辑器。 (我在蛤蟆v11)

在这里输入图像说明

谷仓的答案修改我的工作,因为我的专栏没有压缩。 快速和肮脏的解决scheme:

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

使用TO_CHAR函数。

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

NCHARNVARCHAR2CLOBNCLOB数据转换为数据库字符集。 返回的值始终是VARCHAR2