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

标签 r oracle jdbc

有谁知道使用 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 数据类型转换为 doubleString在 java 。通常这个技巧是有效的,因为 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
}

这将检索 raw 的列表R 中的向量。接下来的步骤取决于数据的性质——在我的应用程序中,这些向量代表 PNG 图像,几乎可以通过 png 处理文件连接。包裹。

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

关于R:如何使用RJDBC从oracle数据库下载blob数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30120275/

相关文章:

oracle - sqoop-连接到oracle并将数据导入IBM BigInsights中的HDFS

SQL隐式连接到显式连接

sql - Oracle SQL 存储过程调用与执行

r - 如何使用PRROC包获取R中随机森林的ROC和PR的auc

r - mgcv:如何使用 Tweedie 响应模型进行逐步回归?

r - igraph 或 ggnet2 的水平 TreeMap

r - 在 R 中编写自定义分类器和预测函数

jdbc - 错误 : No suitable driver found for jdbc:derby:CoffeeDB;create=true

java - 如何在 Quarkus 中启用 Jaeger JDBC 跟踪

java - DB2 JDBC : "Same" query gives different results