有没有人知道使用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信息的一种方式。我可以找到朝这个方向的解决方案吗?
答案 0 :(得分:4)
问题是RJDBC尝试将其读取的SQL数据类型转换为Java中的double
或String
。通常这个技巧是有效的,因为Oracle的JDBC驱动程序具有将不同数据类型转换为String的例程(由getString()
类的java.sql.ResultSet
方法访问)。但是对于BLOB,getString()
方法已经停止了。 RJDBC仍在尝试调用它,这会导致错误。
我尝试挖掘RJDBC的内容,看看我是否可以让它为BLOB列调用正确的函数,显然该解决方案需要修改此包中的fetch
S4方法以及结果抓取Java包内的类。我将尝试将此补丁包装到包维护者。同时,使用rJava进行快速而肮脏的修复(假设conn
和q
,如示例所示):
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