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

R: How to use RJDBC to download blob data from oracle database?

有谁知道使用 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 的方法。我阅读了一些关于 'getBinary()' 的内容,作为获取 blob 信息的一种方式。我能找到那个方向的解决方案吗?

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

我尝试深入研究 RJDBC 的内部结构,看看是否可以让它为 BLOB 列调用适当的函数,显然解决方案需要修改此包中的 fetch S4 方法以及包中的结果抓取 Java class。我会尝试将此补丁提供给软件包维护者。同时,使用 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 >= 1.6