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

rda*_*tor 4 oracle r jdbc

有谁知道使用 RJDBC 包从 Oracle 数据库下载 blob 数据的方法吗?

当我做这样的事情时:

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

blobdata <- dbGetQuery(conn, "select blobfield from blobtable where id=1")
Run Code Online (Sandbox Code Playgroud)

我收到这条消息:

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

好吧,消息很清楚,但我仍然希望有一种方法可以下载 blob。我读过一些关于“getBinary()”的内容,作为获取 blob 信息的一种方式。我能找到那个方向的解决方案吗?

don*_*kin 5

问题是 RJDBC 尝试将其读取的 SQL 数据类型转换为Java 中double的 或。String通常,这个技巧是有效的,因为 Oracle 的 JDBC 驱动程序具有将不同数据类型转换为字符串(通过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
}
Run Code Online (Sandbox Code Playgroud)

这将检索 R 中的向量列表。raw接下来的步骤取决于数据的性质 - 在我的应用程序中,这些向量代表 PNG 图像,并且可以像按png包的文件连接一样进行处理。

使用 R 3.1.3、RJDBC 0.2-5、Oracle 11-2 和适用于 JDK >= 1.6 的 OJDBC 驱动程序完成