【问题标题】:Querying Oracle DB from Revolution R using RODBC使用 RODBC 从 Revolution R 查询 Oracle DB
【发布时间】:2011-03-25 08:03:04
【问题描述】:

使用 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

但是如果我事先不知道行大小(max=1)怎么办

谢谢, 阿伦

【问题讨论】:

    标签: r rodbc


    【解决方案1】:

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

    db

    使用 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=zh_CN; NLS_LANG=American_America

    【讨论】:

    • Cool Rainer!,信不信由你,believeNRows=FALSE 成功了,似乎正在 Windows XP 64bit 上开发 Revolution 64bit 谢谢大家
    • 谢谢——这在连接到 Sybase IQ 时帮助了我
    • 谢谢 - 这在连接到 Firebird 2.5 时帮助了我
    【解决方案2】:

    错误

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

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

    【讨论】:

    • 顺便说一下,有一个包ROracle 提高了对ODBC 驱动程序的要求,但我不知道Revolution 为你移植了它,
    • Revolution 64 位版本还没有移植 ROracle
    【解决方案3】:

    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 的支持下降了。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2014-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-09
        • 1970-01-01
        • 2013-04-17
        • 1970-01-01
        相关资源
        最近更新 更多