我正在使用Oracle数据库,我想阅读BLOB的内容。我该怎么做呢?
当我做一个简单的select语句时,它只返回“(BLOB)”(不带引号)。我如何阅读实际内容?
答案 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 SQL与documentation 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
程序,而不需要索引。