R:如何使用RJDBC从oracle数据库下载blob数据?

时间:2015-05-08 09:23:51

标签: r oracle jdbc

有没有人知道使用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

嗯,消息很清楚,但我仍然希望有一种下载blob的方法。我读了一些关于&#39; getBinary()&#39;作为获取blob信息的一种方式。我可以找到朝这个方向的解决方案吗?

1 个答案:

答案 0 :(得分:4)

问题是RJDBC尝试将其读取的SQL数据类型转换为Java中的doubleString。通常这个技巧是有效的,因为Oracle的JDBC驱动程序具有将不同数据类型转换为String的例程(由getString()类的java.sql.ResultSet方法访问)。但是对于BLOB,getString()方法已经停止了。 RJDBC仍在尝试调用它,这会导致错误。

我尝试挖掘RJDBC的内容,看看我是否可以让它为BLOB列调用正确的函数,显然该解决方案需要修改此包中的fetch S4方法以及结果抓取Java包内的类。我将尝试将此补丁包装到包维护者。同时,使用rJava进行快速而肮脏的修复(假设connq,如示例所示):

s <- .jcall(conn@jc, "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,Oracle 11-2和OJDBC驱动程序完成JDK&gt; = 1.6