簡體   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