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

Rol*_*epp 108 sql oracle blob

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

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

select BLOB_FIELD from TABLE_WITH_BLOB where ID = '<row id>';
Run Code Online (Sandbox Code Playgroud)

我得到的结果并不完全符合我的预期:

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

那么我可以做什么样的神奇咒语来将BLOB变成它的文本表示?

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

Mac*_*Mac 134

首先,您可能希望将文本存储在CLOB/NCLOB列而不是BLOB中,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>';
Run Code Online (Sandbox Code Playgroud)

  • 对我不起作用 - 我得到"ORA-06502:PL/SQL:数字或值错误:原始变量长度太长".我可以在BLOB_FIELD之后加上"2000,1"来获得2000个字符,但除此之外什么都没有. (32认同)
  • cast_to_varchar2在输入中获取RAW(http://docs.oracle.com/cd/E11882_01/appdev.112/e25788/u_raw.htm#autoId18),其长度限制为32767字节(http://docs.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). (4认同)
  • 不幸的是,我不控制数据库模式 - 我只需要窥视blob ......但是还是要感谢. (3认同)
  • 如果该值超过4000,则会抛出错误,因为这是sql中字符串的最大值.你需要添加substr(BLOB_FIELD,4000,1).如果您需要更长时间的现场支持,请使用PL/SQL(我相信最多32000) (2认同)

小智 14

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

SELECT DBMS_LOB.SUBSTR(BLOB_FIELD_NAME) FROM TABLE_NAME;
Run Code Online (Sandbox Code Playgroud)

  • 我有 BLOB 列,XML 数据被压缩并存储在表中,当我读取数据时,它只显示一些数字而不是实际的 xml 文本,我应该怎么做才能从表中读取 XML 文本数据。 (3认同)
  • 这不起作用,原始变量长度太长错误 (2认同)

小智 14

使用此 SQL 获取 BLOB 的前 2000 个字符。

SELECT utl_raw.cast_to_varchar2(dbms_lob.substr(<YOUR_BLOB_FIELD>,2000,1)) FROM <YOUR_TABLE>;
Run Code Online (Sandbox Code Playgroud)

注意:这是因为,Oracle 将无法处理长度超过 2000 的 BLOB 的转换。


phh*_*hhu 9

我可以使用 TO_CLOB (文档)让它工作:

select 
  to_clob(BLOB_FIELD)
from 
  TABLE_WITH_BLOB 
where 
  ID = '<row id>';
Run Code Online (Sandbox Code Playgroud)

这在 Oracle 19c 中适用于我,其 BLOB 字段大于 VARCHAR 限制。我获得可读文本(来自包含 JSON 的 BLOB)


nul*_*ter 8

SQL Developer也提供此功能:

双击结果网格单元格,然后单击编辑:

在此处输入图片说明

然后在弹出窗口的右上部分,“以文本查看”(您甚至可以看到图像。)

在此处输入图片说明

就是这样!

在此处输入图片说明

  • @nullPointer 你真是太棒了!谢谢你的提示。 (3认同)

Bar*_*arn 6

如果你想在文本里面搜索,而不是查看它,这可行:

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;
Run Code Online (Sandbox Code Playgroud)