[英]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.