2015-05-08 67 views
2

有誰知道使用RJDBC包從Oracle數據庫下載blob數據的方法嗎?R:如何使用RJDBC從Oracle數據庫下載blob數據?

當我做這樣的事情:

library(RJDBC) 
drv <- JDBC(driverClass=..., classPath=...) 
conn <- dbConnect(drv, ...) 

blobdata <- dbGetQuery(conn, "select blobfield from blobtable where id=1") 

我得到這個消息:

Error in .jcall(rp, "I", "fetch", stride) : 
    java.sql.SQLException: Ongeldig kolomtype.: getString not implemented for class oracle.jdbc.driver.T4CBlobAccessor 

好了,信息是明確的,但我仍希望有一種方法來下載斑點。我讀了一些關於'getBinary()'作爲獲取blob信息的方法。我可以在那個方向找到解決方案嗎?

回答

2

問題是RJDBC嘗試將它讀取的SQL數據類型轉換爲Java中的doubleString。這個技巧通常會起作用,因爲Oracle的JDBC驅動程序具有將不同數據類型轉換爲字符串的例程(可通過getString()方法java.sql.ResultSet類訪問)。不過,對於BLOB,getString()方法從某個時刻已經停止。 RJDBC仍然會嘗試調用它,這會導致錯誤。

我試着挖掘RJDBC的內核,看看我是否可以調用BLOB列的適當函數,顯然這個解決方案需要修改此包中的fetch S4方法,並且還需要修改此方法中的結果獲取Java類包。我會試着讓這個補丁包包裝維護者。同時,使用rJava快速和骯髒的修復(假設connq在你的例子):

s <- .jcall([email protected], "Ljava/sql/Statement;", "createStatement") 
r <- .jcall(s, "Ljava/sql/ResultSet;", "executeQuery", q, check=FALSE) 
listraws <- list() 
col_num <- 1L 
i <- 1 
while(.jcall(r, 'Z', 'next')){ 
    listraws[[i]] <- .jcall(r, '[B', 'getBytes', col_num) 
    i <- i + 1 
} 

這檢索R. raw載體接下來的步驟取決於數據的性質的清單 - 在我的應用程序,這些載體代表PNG圖像,可以通過png包進行文件連接。

,使用R 3.1.3,RJDBC 0.2-5,甲骨文11-2和OJDBC驅動器,用於JDK> = 1.6

+0

這聽起來輝煌完成!所以我必須在dbGetQuery之前運行這段腳本?我會盡快放棄它。 – rdatasculptor

+0

當我運行這個:s < - .jcall(conn,「Ljava/sql/Statement;」,「createStatement」)時,結果是:as.character.default(obj)中的錯誤: 沒有強制這個S4的方法類向量。你確定它在你的機器上工作嗎? – rdatasculptor

+0

對不起,錯字 - 應該是conn @ jc。將編輯回答 – donshikin

相關問題