有谁知道使用 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 信息的一种方式。我能找到那个方向的解决方案吗?
问题是 RJDBC 尝试将其读取的 SQL 数据类型转换为Java 中double的 或。String通常,这个技巧是有效的,因为 Oracle 的 JDBC 驱动程序具有将不同数据类型转换为字符串(通过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
}
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 驱动程序完成
| 归档时间: |
|
| 查看次数: |
2118 次 |
| 最近记录: |