使用RODBC从Revolution R查询Oracle DB

时间:2010-08-04 15:19:42

标签: r rodbc

使用64位ODBC驱动程序通过DSN连接到Oracle的winxp64位上的Revolution R 64bit中的RODBC错误

library(RODBC)
db <- odbcConnect("oraclemiso",uid="epicedf",pwd="…")
rslts = sqlQuery(db, "select count(*) from FTRAuction")

Error in .Call(C_RODBCFetchRows, attr(channel, "handle_ptr"), max, buffsize,  : 
  negative length vectors are not allowed

我可以连接但在查询内容时出错, 以下作品

 library(RODBC)
 channel <- odbcConnect("OraLSH", <user>, <password>))
 odbcQuery (channel, "select sysdate from dual")
 sqlGetResults(channel, as.is=FALSE, errors=FALSE, max=1, buffsize=1,
nullstring=NA, na.strings="NA", believeNRows=TRUE, dec=getOption("dec"))
              SYSDATE
1 2010-01-24 15:10:02

但如果我之前不知道rowsize(max = 1)

,该怎么办?

谢谢, 阿伦

4 个答案:

答案 0 :(得分:18)

believeNRows = FALSE似乎是关键。打开连接时最好使用它:

  

db&lt; - odbcConnect(dsn =“testdsn”,uid =“testuser”,pwd =“testpasswd”,believeNRows = FALSE)

使用unixODBC的isql进行测试时,它会在64位Linux上报告SQLRowCount为4294967295(即使只有一行),而在32位Linux上报告为-1。这可能是一种优化,因为它可以更快地得到答案。它为数据库节省了立即检索完整响应数据集的负担。例如。可能会有很多记录,而只会提取前几个点击。

4294967295是(2 ^ 32)-1,这是unsigned int的最大值,但是使用signed int将其标记为-1。因此,R抱怨负长度的向量。 所以我认为这是一个关于有符号与无符号整数(或32到64位之间的sizeof(long))的问题。

设置believeNRows = FALSE解决了我的问题所以我可以在两个系统上使用相同的R代码。

BTW:我在Linux 64位上使用R 2.10.1,RODBC 1.3.2,unixODBC 2.3.0和Oracle 10.2.0.4。 一定要使用

  

导出CFLAGS =“ - DBUILD_REAL_64_BIT_MODE -DSIZEOF_LONG = 8 -fshort-wchar”

为unixODBC配置时,因为Oracle ODBC驱动程序需要REAL_64_BIT_MODE,而不是LEGACY_64_BIT_MODE。

并注意国际化问题:R使用$ LANG而Oracle使用$ NLS_LANG。

我遇到过UTF8的问题所以我使用例如

  

LANG = EN_US; NLS_LANG = AMERICAN_AMERICA

答案 1 :(得分:1)

错误

Error in .Call(C_RODBCFetchRows, attr(channel, "handle_ptr"), max, buffsize,  : 
  negative length vectors are not allowed

非常看起来像32位/ 64位移植问题,所以我建议您与相关的两家商业供应商联系以解决这个问题。我更喜欢通过ODBC提供的直接数据库驱动程序,但没有理由为不应该工作,因为64位Linux可以随意播放。

答案 2 :(得分:1)

Dirk是对的 - RODBC不支持Oracle的64位驱动程序,至少几个月前不支持。你可能运气不好。我们遇到了类似的问题,试图让R使用以下工具从64位Linux机箱访问Oracle数据库:64位R,RODBC,unixODBC,Oracle Instant Client。我问R-sig-db列表,包括程序包作者(Ripley教授)有关此问题,并且没有确定的答案。然后我问革命他们是否愿意解决问题,如果我们要从他们那里购买许可证(每年5位数!),他们说没有。

我的公司现在正努力将R的使用最小化到最适合的区域。我们将使用其他工具(Web服务,基于JVM的系统)来访问数据库,并仅在必要时与R共享数据。

潜在的问题是很少有R的主要用户也使用Oracle。 R主要由学者(Excel,MySQL),财务类型(Postgres)以及更多尖端分析团队使用。旧的企业使用Oracle来重视可靠性而不是创新,这与大多数R使用的东西完全相反。因此,我认为这解释了为什么对Oracle的支持已经消失了。

答案 3 :(得分:1)

尝试max=0believeNRows=FALSE - 这对我有用。