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 中的 double
或 String
。通常这个技巧是有效的,因为 Oracle 的 JDBC 驱动程序具有将不同数据类型转换为字符串的例程(通过 java.sql.ResultSet
class 的 getString()
方法访问)。但是,对于 BLOB,getString()
方法已从某个时候停止使用。 RJDBC 仍然尝试调用它,这会导致错误。
我尝试深入研究 RJDBC 的内部结构,看看是否可以让它为 BLOB 列调用适当的函数,显然解决方案需要修改此包中的 fetch
S4 方法以及包中的结果抓取 Java class。我会尝试将此补丁提供给软件包维护者。同时,使用 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 >= 1.6
有谁知道使用 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 中的 double
或 String
。通常这个技巧是有效的,因为 Oracle 的 JDBC 驱动程序具有将不同数据类型转换为字符串的例程(通过 java.sql.ResultSet
class 的 getString()
方法访问)。但是,对于 BLOB,getString()
方法已从某个时候停止使用。 RJDBC 仍然尝试调用它,这会导致错误。
我尝试深入研究 RJDBC 的内部结构,看看是否可以让它为 BLOB 列调用适当的函数,显然解决方案需要修改此包中的 fetch
S4 方法以及包中的结果抓取 Java class。我会尝试将此补丁提供给软件包维护者。同时,使用 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 >= 1.6