7

使用 64 位 ODBC 驱动程序通过 DSN 连接到 Oracle 的 winxp64 位上的 Revolution R 64 位中的 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

4 回答 4

20

相信NRows=FALSE 似乎是关键。最好在打开连接时使用它:

db <- odbcConnect(dsn="testdsn", uid="testuser", pwd="testpasswd", believeNRows=FALSE )

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

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

设置相信NRows=FALSE 为我解决了这个问题,因此我可以在两个系统上使用相同的 R 代码。

顺便说一句:我在 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

于 2010-08-10T13:43:59.177 回答
1

错误

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

看起来很像 32 位 / 64 位移植问题,因此我建议您与相关的两家商业供应商联系以解决该问题。我更喜欢通过 ODBC 提供的直接数据库驱动程序,但没有理由让它不能像 64 位 Linux 那样愉快地运行。

于 2010-08-04T15:24:05.983 回答
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 的支持下降了。

于 2010-08-04T17:26:53.247 回答
1

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

于 2010-08-10T11:25:28.297 回答