Oracle数据库:如何读取BLOB?

时间:2011-04-15 21:07:04

标签: sql oracle blob

我正在使用Oracle数据库,我想阅读BLOB的内容。我该怎么做呢?

当我做一个简单的select语句时,它只返回“(BLOB)”(不带引号)。我如何阅读实际内容?

6 个答案:

答案 0 :(得分:8)

您可以使用UTL_RAW.CAST_TO_RAW(UTL_RAW.CAST_TO_VARCHAR2())以十六进制转储值。

SELECT b FROM foo;
-- (BLOB)

SELECT UTL_RAW.CAST_TO_RAW(UTL_RAW.CAST_TO_VARCHAR2(b))
FROM foo;
-- 1F8B080087CDC1520003F348CDC9C9D75128CF2FCA49D1E30200D7BBCDFC0E000000

这很方便,因为这与插入BLOB列的格式相同:

CREATE GLOBAL TEMPORARY TABLE foo (
    b BLOB);
INSERT INTO foo VALUES ('1f8b080087cdc1520003f348cdc9c9d75128cf2fca49d1e30200d7bbcdfc0e000000');

DESC foo;
-- Name Null Type 
-- ---- ---- ---- 
-- B        BLOB 

但是,在某一点(2000字节?),相应的十六进制字符串超过了Oracle的最大字符串长度。如果您需要处理这种情况,则必须将How do I get textual contents from BLOB in Oracle SQLdocumentation for DMBS_LOB.SUBSTR结合使用,以获得更复杂的方法,以便查看BLOB的子字符串。

答案 1 :(得分:7)

SQL Developer可以将blob显示为图像(至少它适用于jpegs)。在数据视图中,双击BLOB字段以获取“铅笔”图标。单击铅笔以获得一个对话框,允许您选择“查看为图像”复选框。

答案 2 :(得分:2)

如果内容不是太大,您也可以使用

SELECT CAST ( <blobfield> AS RAW( <maxFieldLength> ) ) FROM <table>;

SELECT DUMP ( CAST ( <blobfield> AS RAW( <maxFieldLength> ) ) ) FROM <table>;

这将显示HEX值。

答案 3 :(得分:2)

如果您使用Oracle本机数据提供程序而不是Microsoft驱动程序,则可以使用所有字段类型

Dim cn As New Oracle.DataAccess.Client.OracleConnection
Dim cm As New Oracle.DataAccess.Client.OracleCommand
Dim dr As Oracle.DataAccess.Client.OracleDataReader

连接字符串不需要Provider值,因此您可以使用以下内容:

"Data Source=myOracle;UserID=Me;Password=secret"

打开连接:

cn.ConnectionString = "Data Source=myOracle;UserID=Me;Password=secret"
cn.Open()

附加命令并设置Sql语句

cm.Connection = cn
cm.CommandText = strCommand

设置提取大小。我使用4000,因为它和varchar一样大

cm.InitialLONGFetchSize = 4000

启动阅读器并遍历记录/列

dr = cm.ExecuteReader

Do while dr.read()
    strMyLongString = dr(i)
Loop

如果您首先在列中标识数据类型,则可以更具体地使用read,例如dr.GetOracleString(i)dr.GetOracleClob(i)等。如果您正在阅读LONG数据类型,那么简单dr(i)dr.GetOracleString(i)工作正常。关键是要确保InitialLONGFetchSize对于数据类型足够大。另请注意,本机驱动程序不支持数据阅读器的CommandBehavior.SequentialAccess,但您不需要它,而且LONG字段甚至不必是select语句中的最后一个字段。

答案 4 :(得分:0)

你使用什么客户? .Net,Java,Ruby,SQLPLUS,SQL DEVELOPER?你在哪里写那个简单的选择陈述?

为什么要读取blob的内容,blob包含二进制数据,以便数据不可读。如果要存储文本而不是二进制内容,则应使用clob而不是blob。

我建议您下载SQL DEVELOPER:http://www.oracle.com/technetwork/developer-tools/sql-developer/overview/index.html。使用SQL DEVELOPER,您可以看到内容。

答案 5 :(得分:0)

如果您有兴趣从BLOB获取明文(正文部分),则可以使用CTX_DOC package

例如,CTX_DOC.FILTER过程可以生成文档的纯文本或HTML版本&#34;。请注意,CTX_DOC.FILTER需要BLOB列上的索引。如果您不想要,可以使用CTX_DOC.POLICY_FILTER程序,而不需要索引。