[英]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)]
它使用以下版本工作:
您必须读取二进制数据才能从 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.