2015-05-08 65 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

相关问题