繁体   English   中英

如何通过 JDBC 从 Oracle 数据库中检索实际的 blob 数据而不是“oracle.sql.blob@”?

[英]How to retrieve actual blob data rather than "oracle.sql.blob@" from an Oracle database over JDBC?

我们正在使用 Jython 和 JDBC 从 oracle 数据库检索数据,但 BLOB 字段未返回 blob 数据。 我们看到的不是实际的 blob 数据,而是如下所示的字段:

oracle.sql.BLOB@10e8881

如果我们使用 JDBC 连接在 Razor SQL 中执行相同的查询,我们可以在结果文本中看到 blob,它们看起来不错。 (我们根本看不到字段中的“oracle.sql.Blob”。)

这是执行查询的 Python 代码和 SQL:

cur = connect_to_database()
query = "SELECT * FROM {} WHERE ROWNUM = 1".format(table_name)
cur.execute(query)
results = cur.fetchall()
print results

当我们打印结果时,其中一列具有我们上面显示的值。 我们没有看到二进制 blob。

下面是我们如何执行我们的 Python 脚本:

C:\jython2.7.0\bin\jython.exe C:\path_to_our_script.py

我们如何获得返回的 blob 中的实际二进制数据,而不是我们看到的“oracle.sql.blob@”文本?

如果您可以选择升级到 zxJDBC 而不是纯 JDBC,那么您将立即获得对 blob 到数组转换的支持。

create table T_BLOB (b BLOB,c INTEGER);
insert into t_blob(b,c) values ( utl_raw.cast_to_raw('test1'),1);
insert into t_blob(b,c) values ( utl_raw.cast_to_raw('test2'),1);
commit;

获取 blob 和 int 值:

from com.ziclix.python.sql import zxJDBC

def connect():
    p = {}
    p['URL'] = 'jdbc:oracle:thin:user/password@192.168.0.5:1521:dev'
    db = apply(zxJDBC.connectx, ("oracle.jdbc.pool.OracleDataSource",), p)    
    return db.cursor()

cur = connect()
query = "SELECT * FROM t_blob"
cur.execute(query)
print cur.fetchall()

它打印:

[(array('b', [116, 101, 115, 116, 49]), 1.0), (array('b', [116, 101, 115, 116, 50]), 1.0)]

它使用以下版本工作:

  • oracle:Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Sun Solaris 上的 64 位生产
  • java: [Java HotSpot(TM) 64-Bit Server VM (Oracle Corporation)] on java1.8.0_231
  • jython:Jython 2.7.0(默认:9987c746f838,2015 年 4 月 29 日,02:25:11)
  • jdbc:jdbc7.jar(实现版本:12.1.0.2.0)

您必须读取二进制数据才能从 blob 中获取文本。

以下代码片段大致是您所需要的。

import java.io

# Some code

bs = theBlob.getBinaryStream()
ir = java.io.InputStreamReader(bs)
br = java.io.BufferedReader(ir)

total = ''
st = br.readLine()
while st != None:
   total = total + st
   st = br.readLine()

在上面的代码片段中,blob 被转储到字符串total

以下是读取文件的类似工作示例。

import java.io

f = java.io.File('test.txt')
fr = java.io.FileReader(f)
br = java.io.BufferedReader(fr)

st = br.readLine()
while st != None:
    print st
    st = br.readLine()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM